인수를 취하는 생성자에 동적 프록시를 어떻게 사용할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1001191

  •  05-07-2019
  •  | 
  •  

문제

나는 그들의 Code Sun을 사용하려고 노력했다. 프록시 사용 페이지, 그리고 디버그 프록시를 사용하여 어떤 방법이 호출되는지 인쇄하려고했습니다. 문제는, 내가 대리를 만들고있는 객체는 논쟁이 필요하다는 것입니다. 생성자에 대한 인수로 프록시를 만들려고하면 다음 오류가 발생합니다.

Exception in thread "main" java.lang.ClassCastException: $Proxy0 cannot be cast to myPackage.myClass

나는 다음과 같은 프록시를 만들었습니다.


MyClass mc = (MyClass) DebugProxy.newInstance(new MyClass(props));

프록시 인스턴스를 어떻게 생성하고 여전히 올바른 생성자를 호출 할 수 있습니까?

도움이 되었습니까?

해결책

TheJDK 생성 프록시는 프록시하는 객체와 동일한 클래스 유형이 아닙니다. 대신 대상 객체의 동일한 인터페이스를 구현합니다. 해당 인터페이스 유형 중 하나로 캐스트해야합니다.

링크 된 페이지의 예를 보면 fooimpl이 아닌 foo로 캐스팅됩니다.

다른 팁

클래스가 테스트하려는 인터페이스를 구현합니까? 프록시 클래스는 인터페이스에서 메소드 만 구현합니다. 클래스의 각 방법 (메트릭 또는 디버깅) 전/후에 인쇄하려면 AP (Aspect Deriented Programming)를 사용하여 제안합니다. 나는 그것을 직접 한 적이 없지만 듣는다 종자 당신이 원하는 것입니다.

public interface SomeInterface {
    public void someMethod();
}

public MyClass implements SomeInterface {
...
}

// DebugProxy doesn't return your class, but a class which implements all of the interfaces
// you class implements
SomeInterface mc = (SomeInterface ) DebugProxy.newInstance(new MyClass(props));

프록시를 만들려면 구현하려면 인터페이스를 제공해야합니다. 구체적인 클래스가 아닙니다.

인터페이스는 생성자를 설명하지 않으므로 원하는 것은 즉시 가능하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top