2014-06-16 1 views
1

현재 Prevayler 라이브러리로 직렬화 된 객체의 비 직렬화를 가능하게하는 메커니즘을 작업 중입니다. 예를 들어 : 클래스 "B"에서 "C"는 문자열에 예를 들어 캐스팅 할 필요가 있기 때문에 사용자 정의 클래스 로더를 사용하여 객체에 캐스트 클래스

class A { 
    public B b; 
    public B getB() { 
     return b; 
    } 
} 

class B { 
    public int c; 
    public int getC() { 
     return c; 
    } 
} 

가 지금은, 이전의 어떤 종류가 필요합니다

나는 클래스와 기존의 .jar 있습니다. 내가 similary 내가 "B"그래서 방법 GETC를 호출 할 수 있습니다하는 개체 OBJ 캐스팅 수있는 방법 클래스 B. 으로 이런 짓을 한

// 1. make List of URLs to pass to CustomClassLoader class 
    URL url = new URL(PATH_TO_JAR); 
    List<URL> urls = new ArrayList<URL>(); 
    urls.add(url); 

    // 2. Use CustomLoaderClass, to make sure, that loaded classes/methods are not from current project, 
    // but from the jar specified in URL, since Java class loaders (including URLClassLoader) 
    // first ask to load classes from their parent class loader. 
    CustomClassLoader clsLoader = new CustomClassLoader(urls); 
    java.lang.Class cls = clsLoader.loadClass("A"); 

    // String.class in methods second parametr means, that we should pass String to that method 
    Method method = cls.getMethod("getB"); 

    // 3. invoke method which returns Object instead "B" 
    Object obj = method.invoke(null); 

: 나는 클래스와 메소드를로드하는 사용자 정의 클래스 로더를 사용하고

클래스 B에서?

+1

당신은 늘 동적으로 할당 연산자의 왼쪽에있는 유형을 지정할 수 :

여기 호출의 문서를 참조하십시오. 적어도 나는 그것을 할 방법이 없다는 것을 알고있다. 먼저 B 유형인지 확인한 다음 B로 명시 적으로 변환해야합니다. obj 변수의 유형이 object이지만 B 객체이므로 obcl (B)가 B를 반환해야합니다. –

+0

obj 인쇄 .getClass(). getMethod ("getB"). invoke (null); int 대신 null 포인터 예외를 반환합니다. – Bresiu

+0

오케이, 나는 무엇이 잘못되었는지 압니다. 대신 invoke (null), 나는 "obj"매개 변수를 전달해야합니다 : ... invoke (obj). 그럴 경우 답변을 게시물로 쓰십시오. 따라서이 답변을 수락 된 것으로 표시 할 수 있습니다. 고마워요! – Bresiu

답변

1

할당 연산자의 왼쪽에 유형을 동적으로 지정할 수 없습니다. 적어도 나는 그것을 할 방법이 없다는 것을 알고있다. 해당 B 유형이 먼저 있는지 확인한 다음 B로 명시 적으로 변환해야합니다. obj 변수의 유형이 Object이지만 B 객체이므로 B 클래스를 반환하므로 getClass()가 B를 반환해야합니다. 메서드, Object 형식의 obj 매개 변수는 메서드를 호출 할 개체입니다. 해당 메소드가 정적 인 경우에만 null이 될 수 있습니다. 그렇지 않으면 메소드를 호출 할 A 클래스의 인스턴스를 지정해야합니다. http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html#invoke(java.lang.Object,%20java.lang.Object...)

관련 문제