Question

Je crée des procurations avec javassist ProxyFactory. Lors de la création d'un seul proxy tout va bien de travaux.

Cependant, quand je passe un objet proxy vers le mécanisme de proxy, il échoue avec

  

javassist.bytecode.DuplicateMemberException: Méthode double: SetHandler en com.mypackage.Bean _ $$ _ _ javassist_0 $$ _ javassist_1

Je crée les proxys avec ceci:

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

Alors, comment puis-je créer des procurations de procurations?

Mise à jour: Les problèmes réels que chacun met en œuvre le proxy de ProxyObject qui définit la méthode de setHandler(..). Ainsi, le 2e proxy tente de redéfinir la méthode, au lieu de remplaçant dans la sous.

Était-ce utile?

La solution

Le problème était (en fait, il est la même chose avec CGLIB - Je l'ai essayé en utilisant proxy commons) que je ne devrais pas essayer de créer une classe proxy de la classe proxy. La deuxième procuration devrait à nouveau être de la classe d'origine. Ainsi, en ajoutant la ligne suivante résout le problème:

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

Et un conseil - si vous pouvez utiliser une sorte d'intercepteurs (comme ceux définis dans commons-proxy), faites-le au lieu d'utiliser plusieurs proxies

.

Autres conseils

L'un être intéressé réponse assez tard, mais vous pouvez toujours savoir ceci:

procurations javassist sont mises en œuvre plutôt naïvement. Dans votre code ci-dessus, Javassist toujours créer une classe proxy avec les méthodes suivantes:

  1. Un procédé pour un procédé quelconque substituable de la classe de base
  2. Deux méthodes pour (a) obtenir un gestionnaire proxy (getHandler) et (b) définir un gestionnaire proxy (setHandler)

Les noms des deux dernières méthodes sont en dur par Javassist et représentés par l'interface ProxyObject. Si vous créez maintenant une classe proxy d'une classe proxy, Javassist programmerait la création des méthodes de ProxyObject deux fois. Une fois par la première condition et une fois par la seconde condition.

Vous pourriez éviter cela en définissant une MethodFilter qui spécifie de ne pas les méthodes de priorité sur la ProxyObject telle que javassist ne ferait que créer les méthodes de la deuxième condition. Cependant, cela impliquerait que vous ne pouviez pas mettre plus d'un ProxyObject pour le proxy super classe sans accéder directement au champ correspondant par réflexion. Par conséquent, votre approche est probablement le plus propre.

cglib définit par classe callbacks et non par exemple de telle sorte que ce problème avec cglib est légèrement différent, mais les résultats dans un autre conflit.

Cependant, si vous voulez créer des classes proxy qui ne souffrent pas ces défauts, vous pourriez être intéressé par ma bibliothèque Byte amis que j'écrit après avoir obtenu travail frustré par cglib et javassist lorsque l'on travaille dans les cas d'angle. Si vous travaillez avec la génération de code d'exécution J'espère que cela pourrait aider à offrir une certaine flexibilité vous que les autres bibliothèques manquent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top