0

:반사 - 샘플 코드 - ClassNotFoundException가 내가 반성의이 샘플 코드를하려고했던 오류

run: 
    Exception in thread "main" java.lang.ClassNotFoundException: Test 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:169) 
    at foo.Foo.main(Foo.java:29) 
Java Result: 1 

방법, 나는 위 해결할 수 :

import java.lang.reflect.Method; 

class Test 
{ 

    public Test() 
    { } 

     public void sayHello() 
     { 
      System.out.println("Hello"); 
     } 
} 

    public class Foo 
    {  

     public static void main (String[] args) throws Exception 
     { 
      Class<?> clazz = Class.forName("Test"); 
      Method method = clazz.getMethod("sayHello"); 
      Object instance = clazz.newInstance(); 
      method.invoke(instance); 

     } 
    } 

다음은 표시되어있는 오류입니다 코드에 오류가 있습니다. 나는 또한 Foo.Test를 주었지만 전혀 작동하지 않습니다.

이 문제를 해결하는 데 도움주세요. 감사합니다.

+0

로드 할 '테스트'클래스는 어느 패키지에 있습니까? – Pshemo

+0

컴파일 및 런타임시 클래스 경로에서 클래스를 사용할 수있는 경우 클래스 리터럴 "clazz = Test.class"를 사용할 수 있습니다. 컴파일 시간이 확인됩니다 (컴파일러는 클래스를 찾을 수없는 경우 컴파일러에서 이미 알려줍니다.). classForName()은 클래스가 클래스 경로에 항상 있지 않거나 컴파일 타임에 알려지지 않은 경우 (예 : JDBC 드라이버) – Durandal

답변

2

제공 한 스택 추적에서 패키지 foo가있는 것으로 보입니다. 이 작업을 수행하려면 구현을 다음으로 바꾸십시오.

Class<?> clazz = Class.forName("foo.Test"); 

N.B. 리플렉션이 작동하려면 항상 패키지를 포함한 전체 클래스 이름을 제공해야합니다.

+0

| 고맙습니다, 나는 Foo를 사용하고있었습니다. 당신이 foo라고 말했듯이. 저는 소문자에서 F를 사용해야했습니다. 정말 고맙습니다 . –

+0

친애하는 Pat Wanju 님, 당신은 내 잘못을 너무 우아하게 해결했습니다.이 질문을 해결할 수 있습니까? 그것은 큰 도움이 될 것입니다! 그것의 나의 프로젝트로 그리고 나는 그것이 가능한 빨리 끝내야 할 필요가있다. [link] (http://stackoverflow.com/questions/23680503/how-to-reduce-teh-usage-of-if-else-by-reflection-can-i-get-the-code-example) –

2

클래스의 전체 이름 (패키지 및 클래스 이름 포함)을 제공해야합니다. 예 :

Class<?> clazz = Class.forName("foo.Test"); 
+0

| 감사합니다. Foo.Test를 사용하고 있었고 PAT WANJAU가 foo.Test . 저는 소문자에서 F를 사용해야했습니다. 어쨌든 고맙습니다. –