java - 来自另一个目录的类的初始包

标签 java class reflection classloader

我在如何从另一个目录的类文件初始化包时遇到一些问题

File file=new File("D:\\java\\myproject\\Name_pack\\time\\MyClass.class");
URL[] cp =
{
    new File(file.getParent()).toURI().toURL()
};
URLClassLoader urlcl = new URLClassLoader(cp);
Class cls = urlcl.loadClass(file.getName().replaceAll("\\.class","");

如果类文件不包含包,则它可以工作。
但它包含一个包,我收到一些如下错误:

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: Waktu (wrong name: Name_pack/time/MyClass)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:455)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:367)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

我不知道如何获取包裹。

所以,我想要这样的初始:

Class cls = urlcl.loadClass(Name_pack.time.MyClass);

最佳答案

如果您拥有的只是一个绝对文件路径,而不了解代码库或类的预期包,那么事情就会变得复杂。实际的完整限定名包含在类文件中,这就是类加载器拒绝它的原因;它甚至告诉您异常消息中的实际名称,但是,不能保证异常消息将包含该信息。

由于我不假设您想要开始解析字节码以查找实际的类名,因此我建议重新设计应用程序以首先分别接收类路径目录(代码库)和完全限定的类名.

一个简单但不真正推荐的可能性就是尝试一下:

File file=new File("D:\\java\\myproject\\Name_pack\\time\\MyClass.class");
String className=file.getName();
if(!className.endsWith(".class"))
    throw new IllegalArgumentException(file.toString());
className=className.substring(0, className.lastIndexOf('.'));
File codeBase=file;
Class cls = null;
do {
    codeBase=codeBase.getParentFile();
    URL[] cp = { codeBase.toURI().toURL() };
    URLClassLoader urlcl = new URLClassLoader(cp);
    try { cls = urlcl.loadClass(className); }
    catch(NoClassDefFoundError ex) {
        className=codeBase.getName()+'.'+className;
    }
} while(cls==null);

但正如所说,最好的选择是让无论来源为您提供文件,首先提供正确的代码基目录......

关于java - 来自另一个目录的类的初始包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39360914/

相关文章:

java - 构建测试类?

java - 如何使用 Java 使用 Aspose.Slides 添加通用文件类型的附件?

java - 如何将值从 MainActivity 传递到 ServiceConnection?

java - 从另一个类访问 MainActivity 中的方法

Android解码gif问题

reflection - 避免反射 - 我怎样才能最好地重构这段代码?

java - 为什么我在推送到 Git Android Studio 时出错?

C# 构造函数有 2 个参数,但声称它没有带两个参数的构造函数

java - JDK动态代理和CGLib有什么区别?

c# - 如何在 .NET 中动态调用类的方法?