Java - die Signatur einer Methode in einer Schnittstelle, und das gleiche für seinen Proxy-Implementierung
Ich bin auf der Suche nach einem Weg zum extrahieren der Essenz der Signatur in Java. Der Grund ist, dass ich verwenden möchten, für die Signatur wird ein eindeutiger Schlüssel in einer Map für meine java.lang.reflektieren.Proxys.
Mit diesem code:
public interface MyInterface {
public int compute(String s);
}
...
public static void main (String... args) throws Exception {
InvocationHandler handler = ...;
MyInterface i = (MyInterface) Proxy.newProxyInstance(
Beans.class.getClassLoader(),
new Class<?>[] { MyInterface.class },
handler);
Method m1 = MyInterface.class.getMethod("compute", String.class);
Method m2 = i.getClass().getMethod("compute", String.class);
System.out.printf("%b%f", m1.equals(m2));
}
Das Ergebnis ist offensichtlich falsch.
Dieser code ist nicht der code, den ich verwenden werde, weil ich es brauche, innerhalb der InvocationHandler, aber ich Frage mich, wenn über die Proxy-Implementierungen und die Schnittstelle immer method.getName()
und method.getParameterTypes()
genug ist, oder sollte ich verwenden method.getTypeParameters()
und method.getParameterAnnotations()
auch?
Kurz: wie man eine Signatur der Methode, die für ein interface und die java.lang.reflektieren.Proxy-Implementierungen?
- Brauchen Sie, um zu speichern Sie Ihre proxies in einer Karte? Sie sind nicht teuer zu erstellen, ist es vielleicht nicht der Mühe Wert, um cache Ihnen.
- Nein, ich glaube nicht, meine proxies: nur die Methoden, so vermeide ich eine loooooooong wechseln.
- Was ich meine ist, warum nicht erstellen Sie den Proxy jedes mal, wenn Sie es brauchen, anstatt diese durch Signatur der Methode?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie wollen die
Method
übergebenInvocationHandler
.Was mit dem Ergebnis von
Method.toGenericString
als Schlüssel? Der string zurückgegeben enthält alle details der Signatur, die, so weit ich erzählen kann.Andere Sache, die vielleicht nützlich ist:
Method m2 = i.getClass().getMethod("compute", String.class).getDeclaringClass().getMethod("compute", String.class);
. Das könnte Ergebnis inm1.equals(m2)
true zurückgeben.toGenericString()
(odertoString()
) : Nein, weil die Methode zurückgegeben MyInterface.Klasse.getMethod("compute") gibt ein völlig anderes Ergebnis als ich.getClass().getMethod("compute") Die zweite Lösung ist nicht gültig, da auch die "Deklaration der Klasse" gibt die proxy-Klasse, nicht das interface.Ich hatte nur einen bug mit der code, dies zu tun, nahm ich den Namen, genericReturnType und genericParameterTypes und ich hatte Probleme beim arbeiten mit proxies, weil ich verloren die generischen Informationen.
Ich wechselte zu verwenden name, returnType und parameterTypes und es funktioniert einwandfrei...
Ich auch als mit declaringClass aber ich entfernt es und weiß nicht genau, wie ich das Tat...