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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top