Supposons que vous ayez une interface générique et une mise en œuvre:Comment trouver la première méthode pour déclarer une méthode de référence
public interface MyInterface<T> {
void foo(T param);
}
public class MyImplementation<T> implements MyInterface<T> {
void foo(T param) {
}
}
Ces deux types sont des types de cadre que je propose. Dans la prochaine étape, je veux permettre aux utilisateurs d'étendre cette interface ainsi que redéclarer foo(T param)
pour peut-être l'équiper avec d'autres annotations. Je crée un proxy AOP pour l'interface étendue et intercepte en particulier les appels à des méthodes déclarées plus loin. Comme foo(…)
est maintenant redéclaré dans MyExtendedInterface
Je ne peux pas l'exécuter en appelant simplement MethodInvocation.proceed()
car l'instance de MyImplementation
implémente seulement MyInterface.foo(…)
et non MyExtendedInterface.foo(…)
.
Y a-t-il un moyen d'accéder à la méthode qui a déclaré une méthode initialement? En ce qui concerne cet exemple est-il un moyen de savoir que foo(Bar param)
a été déclaré dans MyInterface
à l'origine et avoir accès à l'instance Method
accoriding? J'ai déjà essayé d'analyser les méthodes de classe de base pour faire correspondre par nom et les types de paramètres, mais cela ne fonctionne pas comme génériques pop et MyImplementation.getMethod("foo", Bar.class)
jette évidemment NoSuchMethodException
. Je sais déjà que MyExtendedInterface
types MyInterface
à Bar
. Donc, si je pouvais créer une sorte de "vue typée" sur MyImplementation
mon algorithme de maths pourrait fonctionner réellement.
Informations complémentaires:
je crée le proxy pour le MyExtendedInterface
comme suit:
ProxyFactory factory = new ProxyFactory();
factory.setTarget(new MyImplementation());
factory.setInterfaces(new Class[] { MyExtendedInterface.class });
factory.addInterceptor(new MyInterceptor(MyExtendedInterface.class));
L'intercepteur assez balaye beaucoup les méthodes et exécute des requêtes JPA pour toutes les méthodes déclarées dans MyExtendedInterface
mais les routes toutes les invocations de méthode des méthodes déclarées dans MyInterface
à la cible proxy. Cela fonctionne tant que les méthodes de MyInterface
ne sont pas redéclarées comme cible, puis ne l'implémentent plus.
public class MyInterceptor implements MethodInterceptor {
public Object invoke(final MethodInvocation invocation)
throws Throwable {
// handling of query methods
// else
invocation.proceed();
// ^^ works if not redeclared but not if
}
}
Donc ce que je voudrais faire au lieu de invocation.proceed() est la méthode qui détecte l'origine a déclaré celui qui est invoqué et invoquer que sur la cible manuellement.
Je n'ai pas de réponse, mais je pense que MyExtendedInterface.class.getMethod ("foo", Bar.class) devrait être ok, avec un marqueur synthétique ou un pont. Est-ce que cela vous aide? – Istao
Je ne comprends pas vraiment comment cela pourrait aider. Je parcoure les méthodes déclarées de 'MyExtendedInterface'. Le problème est que je ne peux pas les mettre en correspondance avec ceux déclarés dans MyImplementation. –
Qu'est-ce que vous utilisez pour les proxies? javassiste? commons-proxy? – Bozho