Come posso usare un proxy dinamico su costruttori che accettano argomenti?
-
05-07-2019 - |
Domanda
Ho provato ad usare il codice pubblicato da Sun sul loro Pagina di utilizzo del proxy e ho provato a utilizzare DebugProxy per stampare il metodo invocato. Il fatto è che l'oggetto per cui sto creando un proxy deve avere un argomento. Se provo a creare il proxy con un argomento per il costruttore, ricevo il seguente errore:
Exception in thread "main" java.lang.ClassCastException: $Proxy0 cannot be cast to myPackage.myClass
Ho creato il proxy in questo modo:
MyClass mc = (MyClass) DebugProxy.newInstance(new MyClass(props));
Come posso creare un'istanza proxy e comunque chiamare il costruttore giusto?
Soluzione
Il proxy generato da JDK non è dello stesso tipo di classe dell'oggetto che si sta eseguendo il proxy. Invece, implementa le stesse interfacce dell'oggetto target. Devi trasmettere a uno di questi tipi di interfaccia.
Se guardi l'esempio nella pagina a cui ti sei collegato, viene trasmesso a Foo, non a FooImpl.
Altri suggerimenti
La tua classe implementa alcune interfacce che stai provando a testare? Le classi proxy implementano metodi solo da un'interfaccia. Se si desidera stampare prima / dopo ogni metodo di una classe (sia esso per metriche o debug), suggerirei di utilizzare la programmazione orientata agli aspetti (AOP). Non l'ho mai fatto da solo, ma sento che AspectJ è quello che vuoi.
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));
Quando si desidera creare un proxy, è necessario fornire un'interfaccia da implementare. Non è una classe concreta.
Le interfacce non descrivono i costruttori, quindi ciò che vuoi fare non è immediatamente fattibile.