2016-09-22 2654 views
0

我有一个程序,我在运行时生成类(仅包含变量和关联的getters和setter方法)。后来我想填补课程。找不到类Class.forName(),但它存在

获取类 - 我知道它的名称,但它不在类路径中 - 我试过.forName()但我总是得到一个ClassNotFoundException。

这是我的例子:

Exception in thread "main" java.lang.ClassNotFoundException: com.test.wam.business.wsobjects.Testclass 
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:264) 
at gui.Application.main(Application.java:94) 

,代码:

URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); 
    DynamicURLClassLoader dynamicURLClassLoader = new DynamicURLClassLoader(urlClassLoader); 
    dynamicURLClassLoader.addURL(new URL("file://C:\\dev\\Eclipse_was\\guitest\\generated")); 

    Class c = Class.forName("com.test.wam.business.wsobjects.Testclass"); 

    Object classInstance = c.newInstance(); 

类加载器:

public class DynamicURLClassLoader extends URLClassLoader { 

public DynamicURLClassLoader(URLClassLoader classLoader) { 
    super(classLoader.getURLs()); 
} 

@Override 
public void addURL(URL url) { 
    super.addURL(url); 
} 

}

的完全限定名称的文件(用e创建clipse - >复制全合格的名称)

/guitest/generated/com/test/wam/business/wsobjects/Testclass.java

这里有什么问题?

+2

“但它不是在类路径”。那。 –

+1

'Class.forName'需要'class'文件,'Testclass.java'不是。 – passion

+0

我能在这种情况下做什么 - 我只有生成的java文件和没有类文件? – Lasirana

回答

0

的方法Class.forName(String)使用调用类的ClassLoader,如果你想使用特定的ClassLoader加载类,你需要使用Class.forName(String name, boolean initialize, ClassLoader loader),而不是为下一个:

Class c = Class.forName(
    "com.test.wam.business.wsobjects.Testclass", true, dynamicURLClassLoader 
); 

注:这将工作如果且只有URL,您提供给您的DynamicURLClassLoader是有效的,并且是您的类的父文件夹的路径

1

我可以看到两个问题:

1)您正在创建一个DynamicURLClassLoader并添加该URL,但实际上并未使用它。此声明:

Class c = Class.forName("com.test.wam.business.wsobjects.Testclass"); 

将使用加载当前类的类加载器。这可能是应用程序的默认类加载器,但它肯定不是您刚刚创建的类加载器。所述javadoc说:

[Class.forName(className)]返回与类或接口与给定字符串名称相关联的Class对象。调用此方法等效于:

Class.forName(className, true, currentLoader) 

其中currentLoader表示当前类的定义类装载程序。

因此....解决的办法是:

Class c = Class.forName("com.test.wam.business.wsobjects.Testclass", 
         true, dynamicURLClassLoader); 

2)此字符串:

"file://C:\\dev\\Eclipse_was\\guitest\\generated" 

不是有效的 “文件:” URL。要尝试的路径,以引用正确的网址是:

"file:///C:/dev/Eclipse_was/guitest/generated" 

,你写的URL 威力的工作方式,但不这样做的正确方法。

参考:

相关问题