Domanda

Sto creando proxy con ProxyFactory javassist. Durante la creazione di un unico delega tutto funziona bene.

Tuttavia, quando passo un oggetto Proxied al meccanismo proxy, non riesce con

  

javassist.bytecode.DuplicateMemberException: metodo di duplicazione: SetHandler in com.mypackage.Bean _ _ $$ javassist_0 _ _ $$ javassist_1

Sto creando delle deleghe con questo:

public Object createProxiedInstance(Object originalInstance) throws Exception {
    Class<?> originalClass = instance.getClass();
    ProxyFactory factory = new ProxyFactory();

    factory.setSuperclass(originalClass);

    factory.setHandler(new MethodHandler() {..});
    Class<T> proxyClass = factory.createClass();

    return proxyClass.newInstance();
}

Quindi, come faccio a creare i proxy di proxy?

Aggiornamento: I problemi reali è che ogni implementa procura la ProxyObject che definisce metodo setHandler(..). Così il 2 ° procura sta cercando di ridefinire il metodo, invece di rilevante nella sottoclasse.

È stato utile?

Soluzione

Il problema era (in realtà, è lo stesso con CGLIB - ho provato con commons-proxy) che non devo cercare di creare una classe proxy della classe proxy. La seconda delega dovrebbe di nuovo essere della classe originale. Quindi aggiungendo la riga seguente risolve il problema:

if (instance instanceof ProxyObject) {
    originalClass = originalClass.getSuperclass();
}

E un consiglio - se è possibile utilizzare una sorta di intercettori (come quelli definiti nel commons-proxy), farlo invece di utilizzare più proxy

.

Altri suggerimenti

E 'una risposta piuttosto tardi, ma si potrebbe ancora essere interessati a conoscere questo:

proxy Javassist sono implementati piuttosto ingenuamente. Nel codice precedente, Javassist sarà sempre creare una classe proxy con le seguenti modalità:

  1. Un metodo per qualsiasi metodo override della classe base
  2. due metodi per (a) ottenere un gestore di proxy (getHandler) e (b) impostare un gestore di proxy (setHandler)

I nomi di questi ultimi due metodi sono fissi da Javassist e rappresentato dall'interfaccia ProxyObject. Se ora si crea una classe proxy di una classe proxy, Javassist sarebbe programmare la creazione di metodi di ProxyObject due volte. Una volta dalla prima condizione e una volta con la seconda condizione.

Si potrebbe evitare questo impostando una MethodFilter che specifica di non sovrascrivere i metodi del ProxyObject tale che javassist creerebbe solo i metodi per la seconda condizione. Tuttavia, ciò implica che non è possibile impostare più un ProxyObject per il proxy super-classe senza accedere direttamente sul campo corrispondente tramite riflessione. Pertanto, il tuo approccio è probabilmente il più pulito.

cglib definisce callback per classe e non per esempio in modo tale che questo problema con cglib è leggermente diversa ma i risultati in un altro conflitto.

Tuttavia, se si desidera creare classi proxy che non soffrono queste carenze, si potrebbe essere interessati a mia biblioteca Byte amici , che ho scritto dopo aver ottenuto di lavoro frustrato con cglib e javassist quando si lavora in casi angolo. Se si lavora con la generazione di codice runtime Spero che possa aiutare offerta una certa flessibilità che le altre librerie mancano.

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