2012-11-08 1 views
0

클래스의 인스턴스를 생성하고 반환하는 데 사용자 정의 클래스 로더를 사용하고 있습니다. 그러나 리플렉션 API를 통해 메소드를 호출하고 사용자 정의 클래스 로더를 생성하고 인스턴스과 같이 반환 가정하면Reflection API를 통한 ClassLoaders 간 매개 변수 전달

: 다음

Object obj = customClassLoader.load(String className,Class[] paramTypes,Object[] param) 

내가 (반사를 통해) 방법을 호출하고 사용자 지정 개체를 전달 나는 아래에 설명 된대로 사용자 정의 개체는 NoSuchMethodException를 얻을 수 :

참고 : TH IS 내가이 방법은 확실히 지정된 사용자 정의 오브젝트를 사용하는 존재하기 때문에 예외를 원인이 될 수 무엇으로 난처한 상황에 빠진거야

Method m = obj.getClass.getDeclaredMethod("mName",new Class[]{aCustomObject.class}) 

m.invoke(obj,new Object[]{new CustomObject() }) 

오류를 일으키는 라인, 나는 모든 방법을 나열하는 반사를 사용하여이를 확인했다 .

+0

는이 클래스에서 사용 가능한 모든 방법을 인쇄 시도하고 거기 방법 (있는 경우) 봤어? 'getDeclaredMethods '사용. –

+0

예, 위에서 언급 한 것처럼 모든 방법을 성공적으로 인쇄 할 수있었습니다. 두 클래스 로더를 사용하고 있기 때문에 궁금합니다. –

답변

2

사용자 정의 로더의 load() 메소드가 반환 할 객체를 인스턴스화하는 방법은 무엇입니까? 올바른 생성자를 찾으려고 시도하는 중에 NoSuchMethodException이 발생했을 가능성이 있습니까?

이 예는 확인을 작동하는 것 같다 :

package com.pholser; 

import java.lang.reflect.Method; 

public class ClassLoading { 
    public static class CustomLoader extends ClassLoader { 
     public Object load(String className, Class<?>[] paramTypes, Object[] params) throws Exception { 
      Class<?> loaded = loadClass(className); 
      return loaded.getConstructor(paramTypes).newInstance(params); 
     } 
    } 

    public static class ACustomObject { 
    } 

    public void foo(ACustomObject a) { 
     System.out.println("foo"); 
    } 

    public static Object newCustomObject() throws Exception { 
     return new CustomLoader().load("com.pholser.ClassLoading$ACustomObject", new Class<?>[0], new Object[0]); 
    } 

    public static void main(String[] args) throws Exception { 
     ClassLoading obj = new ClassLoading(); 

     Method m = obj.getClass().getDeclaredMethod("foo", ACustomObject.class); 

     m.invoke(obj, newCustomObject()); 
    } 
} 
+0

마지막 행은 다음과 같아야합니다. m.invoke (obj, new CustomObject()); 나는 이것을 반영하기 위해 나의 질문을 업데이트했다. 귀하의 예제가 예상대로 작동하고 ClassLoading 클래스를 인스턴스화 한 클래스 로더와 동일한 클래스 로더를 사용하여 새 오브젝트를 생성하기 때문에이 클래스가 의심 스럽습니다. 예제에서는 기본 클래스 로더에 의해 인스턴스화 된 객체를 전달하려고합니다. –

+0

또한 자세한 답변을 주셔서 대단히 감사드립니다. –