2016-09-22 1 views
0

런타임에 클래스를 생성하는 프로그램이 있습니다 (변수 및 관련 getter 및 setters 메소드 만 포함). 나중에 나는 수업을 채우고 싶다.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); 
} 

}

파일의 전체 자격을 갖춘 이름 (전자로 만든 clipse -> 복사 전체 자격을 갖춘 이름)

/guitest/generated/com/test/wam/business/wsobjects/Testclass.java 여기에 어떤 문제가

?

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

NB :이 작동합니다 당신이 당신의 클래스를 옆으로 대신 Class.forName(String name, boolean initialize, ClassLoader loader)을 사용할 필요가로드 특정 ClassLoader을 사용하려는 경우

+2

"하지만이 아닌 클래스 경로에". 그. –

+1

'Class.forName'은'class' 파일을 필요로합니다.'Testclass.java'는 그렇지 않습니다. – passion

+0

이 경우 어떻게해야합니까? 생성 된 Java 파일과 클래스 파일 만 있습니까? – Lasirana

답변

0

방법 Class.forName(String) 호출자 클래스의 ClassLoader를 사용 DynamicURLClassLoader에 제공하는 URL 만 유효하고 클래스가있는 상위 폴더의 경로입니다

1

두 가지 문제가 발생할 수 있습니다 :

1) DynamicURLClassLoader을 만들고 URL을 추가했지만 실제로 사용하지는 않습니다. 이 진술 :

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

은 현재 클래스를로드 한 클래스 로더를 사용합니다. 아마도 응용 프로그램의 기본 클래스 로더 일 것이지만 방금 만든 클래스 로더는 아닙니다. javadoc는 말한다 :

[Class.forName(className)] 지정된 캐릭터 라인 명을 가지는 클래스 또는 인터페이스에 관련된 Class 개체를 반환합니다. 이 메소드를 호출하는 것은 동일하다 : currentLoader 현재 클래스를 정의하는 클래스 로더를 나타낸다

Class.forName(className, true, currentLoader) 

.

so ....해결책은 다음과 같습니다

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

2)이 문자열 : URL :

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

유효한 "파일"이 아닙니다.

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

당신이 URL 작업을 작성하는 방법,하지만 그것을 할 올바른 방법이 아니다 : 참조에 당신이하려고하는 경로에 대한 올바른 URL이 될 것입니다.

참조 :

관련 문제