Wie kann ich einen dynamischen Proxy auf Konstrukteure verwenden, die Argumente?

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

  •  05-07-2019
  •  | 
  •  

Frage

Ich habe versucht, den Code zu verwenden, Sun hat auf ihre Proxy Nutzung , und ich versuchte, die DebugProxy drucken zu können, welche Methode aufgerufen wird. Die Sache ist, das Objekt, das ich für einen Proxy bin zu schaffen, muss ein Argument haben. Wenn ich versuche, den Proxy mit einem Argument an den Konstruktor zu erstellen, erhalte ich folgende Fehlermeldung:

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

Ich habe die Proxy wie folgt:


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

Wie kann ich einen Proxy-Instanz, und immer noch das Recht Konstruktor aufrufen?

War es hilfreich?

Lösung

TheJDK generierte Proxy ist nicht von derselben Klasse wie das Objekt, das Sie Proxying. Stattdessen setzt sie die gleichen Schnittstellen des Zielobjekts. Sie müssen eine dieser Schnittstellentypen werfen.

Wenn Sie sich das Beispiel schauen Sie auf der Seite, die Sie verbunden sind, es zu Foo Gießen, nicht FooImpl.

Andere Tipps

Hat Ihre Klasse implementieren einige Schnittstelle Sie zu testen sind versuchen? Proxy-Klassen implementieren nur Methoden aus einer Schnittstelle. Wenn Sie vor / nach jeder Methode einer Klasse drucken möchten (sei es für Metriken oder Debuggen) Ich würde vorschlagen Aspect orientierte Programmierung mit (AOP). Ich habe noch nie es selbst getan, aber ich höre AspectJ ist das, was Sie wollen.

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));

Wenn Sie einen Proxy erstellen möchten, müssen Sie eine Schnittstelle schaffen, zu implementieren. Nicht eine konkrete Klasse.

Schnittstellen Bauer nicht beschreiben, so was Sie tun wollen, nicht sofort möglich ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top