2013-01-03 1 views
0

:동적 프록시 및 방법 주석 I는 다음과 같은 종류가

interface Ivisitor{ 

    @deduceStrategy("...") 
    void visit(Icosmos c); 
} 

방문자가이 인터페이스를 구현한다

class Visitor implements Ivisitor{ 
     @deduceStrategy("...") 
    public void visit(Icosmos c) 
    { 
     .... 
    } 
} 

동적 프록시 : 핸들러 클래스

public class strategyLoader{ 
    public static <T> T create(Class<T> clazz,Object wrap) { 
     T object = (T) Proxy.newProxyInstance(strategyLoader.class.getClassLoader(), new Class[] { clazz },new Handler(wrap)); 
     return object; 

    } 
} 

주요부 :

public class Handler implements InvocationHandler { 
Object obj; 
public Handler(Object obj) { 
this.obj = obj; 
} 

public Object invoke(Object proxy, Method m, Object[] args) 
      throws Throwable { 
     if (m.isAnnotationPresent(deduceStrategy.class)) { 
    Class[] parameterTypes = m.getParameterTypes(); 
    if((parameterTypes.length==1)&&(**Icosmos.class.isInstance(parameterTypes[0])**)) 
     { 
      ........ 
     } 

Visitor.visit에 전달 된 Icosmos의 정확한 유형을 기반으로 적절한 전략을로드해야합니다. 그러나 매개 변수 [0]은 절대로 Icosmos 인스턴스로 해석되지 않습니다. 누군가 나에게 탈출구를 보여 주면 감사하겠습니다. 클라이언트가로 방문자를 호출

Ivisitor visitor = strategyLoader.create(Ivisitor.class,Visitor.class.newInstance()); 

답변

1
Icosmos.class.isInstance(parameterTypes[0]) 

parameterTypes[0] instanceof Icosmos 정확히 동일합니다, 그리고 객체 parameterTypes[0]Icosmos의 인스턴스인지 여부를 확인 (가 아니다 - 그것은 java.lang.Class이다).

정말 필요한 것이 두 가지 가능성이 있습니다. 하나는

Icosmos foo = x; 

이없이 법적 것,

클래스 parameterTypes[0]Icosmos으로 할당과 호환되는지 확인
Icosmos.class.isAssignableFrom(parameterTypes[0]) 

는, parameterTypes[0]가 나타내는 클래스의 인스턴스 인 x를 부여하여 예 것 캐스트. 이 경우 형식의 첫 번째 형식 매개 변수 형식이 Icosmos과 호환되는지 확인합니다.

번째 대안은 실제 인수 값보다는 공식 매개 변수의 선언 된 유형의 런타임 유형을 확인

args[0] instanceof Icosmos 

것이다.

+0

instanceof를 컴파일하지 않았다 발견 불환 유형 : 필요 java.lang.Class의 : com.patterns.visitor.Icosmos이 일지 어떨지는 일을했다. 이 차이가 발생하는 이유는 무엇입니까? 형식을 지정할 수 있지만 기본 인터페이스 나 클래스의 인스턴스는 할당 할 수없는 경우는 언제입니까? – IUnknown

+1

@IUnknown 여기서 'isAssignableFrom' 두 java.lang.Class 객체 사이의 관계를 테스트하면,'instanceof' 연산자는 클래스 또는 인터페이스 이름에 대해 객체 참조를 테스트합니다. 'java.lang.Class'에 대해 객체 참조를 테스트하는 동적 버전의'instanceof'는 당신이 시작한'isInstance()'메소드입니다. –

관련 문제