2013-01-11 13 views
6

Ho il seguente codice che funziona per la creazione di un'istanza Proxy per un tipo di interfaccia sostenuta da un InvocationHandler implementazione, però quando uso un tipo di classe concreta non funziona e questo è ben noto e documentato in Proxy.newProxyInstance:creazione dell'istanza Java Proxy per un tipo di classe?

// NOTE: does not work because SomeConcreteClass is not an interface type 
    final ClassLoader myClassLoader = SomeConcreteClass.getClassLoader(); 
    SomeConcreteClass myProxy = (SomeConcreteClass) Proxy.newProxyInstance(myClassLoader, new Class[] { 
     SomeConcreteClass.class }, new InvocationHandler() { /* TODO */ });   

Tuttavia, se ricordo correttamente ho visto questo caso d'uso lavorare in alcuni quadri di simulazione dove è possibile prendere in giro un tipo di classe concreto ad es. EasyMock. Prima di verificare il loro codice sorgente, qualcuno può indicare che cosa deve essere fatto per il proxy anche i tipi di classe concreti e non solo le interfacce?

risposta

12

I proxy dinamici JDK funzionano solo con le interfacce. Se si desidera creare un proxy con una superclasse concreta, è necessario utilizzare qualcosa come CGLIB.

Enhancer e = new Enhancer(); 
e.setClassLoader(myClassLoader); 
e.setSuperclass(SomeConcreteClass.class); 
e.setCallback(new MethodInterceptor() { 
    public Object intercept(Object obj, Method method, Object[] args, 
     MethodProxy proxy) throws Throwable { 
    return proxy.invokeSuper(obj, args); 
    } 
}); 
// create proxy using SomeConcreteClass() no-arg constructor 
SomeConcreteClass myProxy = (SomeConcreteClass)e.create(); 
// create proxy using SomeConcreteClass(String) constructor 
SomeConcreteClass myProxy2 = (SomeConcreteClass)e.create(
    new Class<?>[] {String.class}, 
    new Object[] { "hello" }); 
+0

allora la questione OP sarebbe: come CGLIB lo fa in termini di puro Java :) –

+3

@GiovanniAzua genera dinamicamente il bytecode per la sottoclasse proxy utilizzando la libreria ASM manipolazione bytecode. –

+0

Vedo, grazie. –

Problemi correlati