2011-08-19 3 views
2

follwoing 코드를 사용하여 최종 클래스를로드하려고하는 중입니다.자바 리플렉션을 사용하여 최종 클래스를로드하는 방법

final ClassLoader myClassLoader = ClassLoader.getSystemClassLoader(); 
final String classNameToBeLoaded = "demo"; 
final Class myClass = myClassLoader.loadClass(classNameToBeLoaded); 
    // create a new instance 
final Constructor cons = demo.class.getConstructor();......(1) 
final Object whatInstance = cons.newInstance(); 

이 메소드는 예외를 반환하지 않습니다 ... 1. 문제는 ...?

답변

1
final Constructor cons = demo.class.getConstructor(); 

는,이 두 가지 중 하나를 의미

중 하나가 디폴트 생성자 없다거나 공공 아니다 (당신은 class.getConstructor(...)는 public 생성자를 반환하는 경우 공용 기본 생성자가 있었다 처음에는 이것을하지 않을 것입니다).

대신 getConstructor()getDeclaredConstructor(...)를 사용하여 두 번째 문제를 해결할 수 있습니다, 모든 가시성과 생성자를 찾습니다

final Constructor<Demo> cons = demo.class.getDeclaredConstructor(); 
Demo demo = cons.newInstance(); 

첫 번째 문제는 분명 :-) 귀하의 코드 데모 경우 작동

2

해당 클래스의 실제 정의를 보지 않고 클래스에 공용 기본 (매개 변수없는) 생성자가 없을 수도 있습니다.

사실, 문제는 당신이 클래스 Class 대신 실제 클래스의 생성자를 얻으려고 노력하는 것 같다 : myClass가 참조 :

final Class myClass = myClassLoader.loadClass(classNameToBeLoaded); 
    // create a new instance 
final Constructor cons = demo.class.getConstructor();......(1) 

마지막 줄의 메서드 호출 myClass.getConstructor() 대신해야 demo 클래스의 클래스 토큰 인 Class 유형의 객체로 이동합니다. 따라서 myClass.class은 클래스 토큰 인 myClass의 클래스 토큰을 참조합니다. 실제로 그렇게 대중화 된 생성자가 없다는 것입니다.

Btw 클래스 또는 변수 final은 리플렉션 또는 클래스로드 문제와 관련이 없습니다. 클래스 패스에서 public이고 public 인 생성자를 가진 클래스를로드 할 수 있습니다 (생성자에 매개 변수가 있지만 위의 코드보다 조금 복잡합니다). 이것이 실패하면

+0

'myClass.getConstructor()'경우 도움이되지 않습니다 클래스를 가정

공공받는 생성자와 INT 매개 변수가 생성자는 공개되지 않습니다. myClass.getDeclaredConstructor()가 아니면 안된다. –

0
try { 
    Object instance = Class.forName("com.foo.Demo").newInstance(); 
} catch(ClassNotFoundException e) { 
    // do something 
} 
+0

생성자가 보이지 않으면 도움이되지 않는다. –

0

, 강인 클래스에는 기본 생성자 또는 public 인수가없는 생성자가 있습니다. 당신이 개인 생성자를 가지고 인스턴스화를 사용하려고하면 , 당신은 당신은 단지 적절한 생성자를 사용할 필요가

java.lang.IllegalAccessException: Class ... can not access a member of class demo with modifiers "private"

를 얻을. 여기

public final class Demo { 
    private final int i; 

    public Demo(int i) { 
     this.i = i; 
    } 

    public void doSmth() { 
     System.out.print("Your number is: " + i); 
    } 
} 

홈페이지 클래스 :

import java.lang.reflect.Constructor; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     final ClassLoader myClassLoader = ClassLoader.getSystemClassLoader(); 
     final String classNameToBeLoaded = "Demo"; 
     final Class myClass = myClassLoader.loadClass(classNameToBeLoaded); 
     // create a new instance 
     final Constructor cons = Demo.class.getConstructor(int.class); 
     int i = 10; 
     final Object whatInstance = cons.newInstance(i); 
     // prints: Your number is: 10 
     ((Demo) whatInstance).doSmth(); 
    } 
} 
관련 문제