Comment utiliser un proxy dynamique sur des constructeurs prenant des arguments?

StackOverflow https://stackoverflow.com/questions/1001191

  •  05-07-2019
  •  | 
  •  

Question

J'ai essayé d'utiliser le code affiché par Sun sur leur Page d'utilisation du proxy , et j'ai essayé d'utiliser DebugProxy pour imprimer la méthode appelée. Le fait est que l'objet pour lequel je crée un proxy doit avoir un argument. Si j'essaie de créer le proxy avec un argument au constructeur, le message d'erreur suivant s'affiche:

Exception in thread "main" java.lang.ClassCastException: $Proxy0 cannot be cast to myPackage.myClass

J'ai créé le proxy comme suit:


MyClass mc = (MyClass) DebugProxy.newInstance(new MyClass(props));

Comment créer une instance de proxy tout en appelant le constructeur de droite?

Était-ce utile?

La solution

Le proxy généré par JDK n’est pas du même type de classe que l’objet mandaté. Au lieu de cela, il implémente les mêmes interfaces de l'objet cible. Vous devez diffuser vers l'un de ces types d'interface.

Si vous regardez l'exemple de la page vers laquelle vous avez créé le lien, il s'agit du casting vers Foo, pas avec FooImpl.

Autres conseils

Votre classe implémente-t-elle une interface que vous essayez de tester? Les classes proxy n'implémentent des méthodes qu'à partir d'une interface. Si vous souhaitez imprimer avant / après chaque méthode d'une classe (que ce soit pour les métriques ou le débogage), je suggérerais d'utiliser la programmation orientée aspect (AOP). Je ne l'ai jamais fait moi-même, mais j'entends dire que AspectJ est ce que vous voulez.

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

Lorsque vous souhaitez créer un proxy, vous devez fournir une interface à implémenter. Pas un cours concret.

Les interfaces ne décrivent pas les constructeurs. Ce que vous voulez faire n'est donc pas immédiatement réalisable.

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