2016-09-05 6 views
0

리플렉션을 사용하여 내부 클래스의 객체를 만들고 싶습니다. 나는 반사를 사용하여 내부 클래스 CompTypeConfig를 호출해야리플렉션을 사용하여 내부 클래스의 생성자를 호출하는 방법

//outer class 
public final class EMSToCompMessages { 
private EMSToCompMessages() {} 
//inner class 
public static final class CompTypeConfig extends 
{ 
    private CompTypeConfig(com.google.protobuf.GeneratedMessage.Builder<?> builder) { 
     super(builder); 
     this.unknownFields = builder.getUnknownFields(); 
    } 
    private CompTypeConfig(boolean noInit) { 
     this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); 
    } 

    private static final CompTypeConfig defaultInstance; 
    public static CompTypeConfig getDefaultInstance() { 
     return defaultInstance; 
    } 
} 

: 이것은 내 클래스입니다.

java.lang.IllegalArgumentException가 : 나는 예외 다음 얻고있다 인수 내가 잘못 뭐하는 거지

의 번호를 잘못?
나는 다음과 같은 코드를 사용하고 있습니다 :

Class<?> loadedMyClass = Class.forName("EMSToCompMessages", true, loader); 
     Constructor constructor = loadedMyClass.getDeclaredConstructor(); 
     constructor.setAccessible(true); 
     Object obj = constructor.newInstance(); 
     Class[] innerClass = loadedMyClass.getDeclaredClasses(); 
     for (Class<?> getClass : innerClass) { 
      Constructor ctor = getClass.getDeclaredConstructors()[0]; 
       System.out.println(ctor.getName()); 
       ctor.setAccessible(true); 
       Object innerObj = ctor.newInstance(obj);// Exception is coming here 
     }    
+0

내부 클래스가 아니며 정적 중첩 클래스입니다. 그리고 그것을 만들고 싶다면 생성자에 매개 변수를 전달해야합니다. – shmosel

답변

0

당신은 매개 변수가없는 생성자에는이 없습니다 CompTypeConfig 유형의 개체를 만들어보십시오. CompTypeConfig에는 com.google.protobuf.GeneratedMessage.Builder<?> builderboolean noInit 매개 변수가있는 두 개의 생성자가 있습니다. 객체를 생성 할 때 param을 전달해야합니다. 또한 내가 알기로, 생성자에 대해 잘못된 매개 변수 유형을 전달합니다.

0

당신은 분명히 EMSToCompMessages 클래스가 아닌 내부 클래스의 인스턴스를 만들려고합니다

Object innerObj = constructor.newInstance(obj); //you wrote constru, which isn't defined 

는 Constructor.newInstance (OBJ)를 호출하는 것을 시도하고있다.

어쨌든, 자바 독은

이 Class 객체가 나타내는 클래스의 지정된 public 생성자를 반영하는 Constructor 객체를 리턴합니다 (getConstructor 메소드 방법에 대해) 말한다. parameterTypes 매개 변수는 생성자의 형식 매개 변수 유형 인 을 선언 된 순서로 식별하는 Class 개체의 배열입니다. 이 클래스 객체가 비 정적 인 컨텍스트로 선언 된 내부 클래스를 나타내는 경우 형식 매개 변수 유형은 명시 적으로 첫 번째 매개 변수 인 인스턴스를 포함합니다.

따라서 먼저 내부 클래스 생성자를 public으로 만들어야합니다. 이 경우 setAccessible (true)를 호출하는 것으로는 충분하지 않습니다.

관련 문제