So merke ich, die Antwort auf diese wahrscheinlich ist „es ist hart“, aber:Java: neue Implementierung des Typs zur Laufzeit erstellen?
Ich habe eine seltsame Idee, und frage mich, ob es in Java möglich ist wie ein Verfahren zu schaffen:
<T> T wrapInterface (Class<T> interfaceClass, T wrappedObject) {
if (mClass.isInterface()) {
//create a new implementation of interfaceClass that, in each method,
//does some action before delegating to wrappedObject
return thatImplementation;
}
}
Also, wenn meine Schnittstelle Foo eine Methode foo() definiert, möchte ich, dass diese Methode eine neue Klasse erstellt, die ungefähr so aussieht, eine Instanz dieser Klasse mit WrappedObject als Konstruktorparameter erstellt und dann zurückgegeben hat :
public class GeneratedClass implements Foo {
private Foo wrapped;
public GeneratedClass (Foo wrapped) {
this.wrapped = wrapped;
}
@Override
public void foo() {
System.out.println("Calling Foo.foo() on wrapped object " +
wrapped.toString());
wrapped.foo();
}
}
Die Anwendung Ich denke, ist komplizierter als nur den Anruf zu protokollieren, aber Protokollierung ist ausreichend für die Idee. Ich würde das gerne mit einer großen Anzahl von Schnittstellentypen machen, weshalb ich nicht alle GeneratedClasses von Hand schreiben würde.
Bonuspunkte für eine Lösung, die keine extralinguistischen Funktionen erfordert (AspectJ oder ähnliches) und doppelte Bonuspunkte, wenn dies nur mit den Standard-JDK-Bibliotheken möglich ist.
(Ich brauche keine präzise, übersetzbar Antwort,. Nur einen Zeiger auf den richtigen Sätze von Tools/Bibliotheken/etc, die mich das tun lassen würde)
Dank!
Reflection (einschließlich 'java.lang.Class') ist eine außersprachliche Funktion. –
Sie können sich [dynamische Proxy-Klassen] (http://docs.oracle.com/javase/7/docs/technotes/guides/reflection/proxy.html) ansehen. –