Interface mittels Reflection implementieren

Status
Nicht offen für weitere Antworten.

rapthor

Bekanntes Mitglied
Hallo,

ich weiß nicht, ob der Titel überhaupt mit dem übereinstimmt, was ich suche. Ich will eine Methode schreiben, die als Argument ein Interface bekommt. Dieses Interface möchte ich nun innerhalb des Methodenkörpers implementieren. Etwa so:

Code:
public Class getImplementation(Class interface)
{
        return new  ........ ??
}

Wie bewekrstellige ich diese Funktionalität mittels Reflection?

Danke im Voraus,
Rapthor
 

AlArenal

Top Contributor
*kratzamkopf*

Ich wüsste nicht, dass das in Java geht. Wäre wohl eher was für Smalltalk...

Darf man fragen warum du meinst sowas zu benötigen und wozu es gut sein soll?
 

rapthor

Bekanntes Mitglied
AlArenal hat gesagt.:
*kratzamkopf*

Ich wüsste nicht, dass das in Java geht. Wäre wohl eher was für Smalltalk...

Darf man fragen warum du meinst sowas zu benötigen und wozu es gut sein soll?

Der Vorschlag eine Factory zu bauen und darin ein Interface zu einer Implementierung zu machen, habe ich von einem Apache Projekt für XML RPC. Auf einem Server existieren bestimmte Methoden, die ausgeführt werden können. Das Interface beschreibt diese Methoden. Der Client erhält nur das Interface und in dessen Implementierung findet der Kontakt zum Server statt.

Das Ganze ist nicht so wichtig zu verstehen. Es wird klarer, wenn man sich folgende Beschreibung von Apache ansieht:

The factory can take an interface as input and returns an implementation, which internally calls the server by using the XmlRpcClient.

Perhaps some code shows more than words. First of all, let's create a request processor interface.

Code:
    package com.foo;

    public interface Adder {
      public int add(int pNum1, int pNum2);
    }

The server contains the request processors implementation:

Code:
    package com.foo;

    public class AdderImpl implements Adder {
      public int add(int pNum1, int pNum2) {
        return pNum1 + pNum2;
      }
    }

And here is how the client would use this:

Code:
    import com.foo.Adder;
    import org.apache.xmlrpc.client.XmlRpcClient;
    import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
    import org.apache.xmlrpc.client.util.ClientFactory;

    XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
    config.setServerUrl("http://127.0.0.1:8080/xmlrpc");
    XmlRpcClient client = new XmlRpcClient();
    client.setConfig(config);
    ClientFactory factory = new ClientFactory(client);
    //hier ist der Knackpunkt !!!!
    Adder adder = (Adder) factory.newInstance(Adder.class);
    // da war der Knackpunkt
    int sum = adder.add(2, 4);

Im letzten Ausschnitt zwischen den Kommentaren ist das, woran ich gerade arbeite .... es interessiert mich, wie ich das umsetzen könnte.

Oder habe ich einen gänzlich falschen Ansatz gewählt?
 
S

SlaterB

Gast
normalerweise generieren solche Tools doch wohl neue .java-Dateien und kompilieren die,
kenn ich zwar nicht zur Laufzeit mit Factory, aber so werden doch Stubs aus WSDL-Beschreibungen usw. erstellt,

also in deinem Fall vielleicht Datei schreiben, kompilieren und instanziieren
 

SnooP

Top Contributor
wie gesagt, guck dir mal javassist an... damit kann man zur Laufzeit Quellcode kompilieren und ausführen lassen... benutzen wir hier, um Java-Ausdrücke in einer eigenen Sprache in tatsächliche Java-Methoden zu überführen, die dann ausgewertet werden... - damit sollte auch obiges machbar sein, da du ja tatsächlich reflektiv quellcode generieren möchtest und am Ende eine Quasi-Stub-Klasse dem Interface entsprechend willst... diese injiziert dann vermutlich Methoden von wo ganz anders? Evtl. ne entsprechende Remote-Verbindung?
Wie Slater schon sagte, ist der übliche Weg für sowas eigentlich aus den Interfaces entsprechende Stub und Skelleton-Klassen zu erzeugen, die den Zugriff auf ein Remote oder Home-Interface ermöglichen... diese werden aber vorher generiert aus einem übergebenen Interface... z.B. in IDL bei Corba oder WSDL... etc.
 
G

Guest

Gast
Wie wär's mit einem Proxy?
Code:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyExample
{
   static interface MyInterface
   {
      public void a();
      public void b();
      public void c();
   }
   
   private static Object implement(Class clazz)
   {
      return Proxy.newProxyInstance(
         clazz.getClassLoader(), 
         new Class[]{ clazz }, 
         new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
            {
               System.out.println(method.getName());
               return null;
            }
         }
      );
   }
   
   public static void main(String[] args)
   {
      MyInterface intf = (MyInterface)implement(MyInterface.class);
      intf.a();
      intf.b();
      intf.c();
   }
}
 

rapthor

Bekanntes Mitglied
Alles klar, ich sehe es ein. Es geht wohl nicht ohne Code Generierung. Ich muss mal sehen, dass ich das auf eine andere Art und Weise löse.

Danke euch beiden.
 

rapthor

Bekanntes Mitglied
Jetzt habe ich doch noch eine einfachere Lösung gefunden:

"java.lang.reflect.Proxy" ermöglicht es mir ein Interface zu übergeben, das ich mittels InvocationHandler implementieren kann. Hier ist eine konkrete Anwendung dazu, wie ich sie umgesetzt habe:

Code:
/*
 * Factory to retrieve RPC handlers from interfaces. You must provide a valid XMLRPCClient to the constructor.
 * After calling createHandler() cast the resulting object to the interface you provided. 
 */
public class RPCHandlerFactory
{
	private InvocationHandler invocationHandler;
	private Map<String, Object> handlerImplementations;
	
	public RPCHandlerFactory(final XmlRpcClient client)
	{
		// Map storing implementations for faster access.
		handlerImplementations = new HashMap<String, Object>();
		
		invocationHandler = new InvocationHandler()
		{
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
			{
				return client.execute(method.getDeclaringClass().getSimpleName() + "." + method.getName(), args);
			}
		};		
	}
	
	public Object createHandler(Class handlerInterface)
	{
		// Look for implementation in the map, caused by former calls. 
		Object handlerImplementation = handlerImplementations.get(handlerInterface.toString());
 
		if (handlerImplementation != null)
			return handlerImplementation;
		
		Class proxyClass = Proxy.getProxyClass(handlerInterface.getClassLoader(), new Class[] { handlerInterface });
		
		try
		{
			handlerImplementation = proxyClass
			.getConstructor(new Class[] { InvocationHandler.class })
			.newInstance(new Object[] { invocationHandler });
		}
		catch (....)
		{
			....
		}		
		// Put implementation into map for faster access next time.
		if (handlerImplementation != null)
			handlerImplementations.put(handlerInterface.toString(), handlerImplementation);
		
		return handlerImplementation;
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Leere vererbte Interface-Methoden Allgemeine Java-Themen 8
OnDemand Interface imlementieren Allgemeine Java-Themen 4
Buroto Interface Allgemeine Java-Themen 2
T Komische Zeichen im Zusammenhang mit Serializable interface Allgemeine Java-Themen 13
M Kann man Annotationen auf Klassen einschränken die ein Interface implementieren? Allgemeine Java-Themen 1
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
B JaxB und @XmlIDREF mit Interface Allgemeine Java-Themen 1
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
P Abstrakte Klassen vs. Interface Allgemeine Java-Themen 4
Kirby.exe Autocloseable Interface Allgemeine Java-Themen 2
T Abgeleitetes Interface public ohne Schlüsselwort "interface"? Allgemeine Java-Themen 3
S static in Interface und Klasse Allgemeine Java-Themen 2
S static methode im Interface Allgemeine Java-Themen 1
S Interface, generischer Datentyp, Exception? Allgemeine Java-Themen 3
B Vererbung Interface und implementierende Klassen Allgemeine Java-Themen 8
A Anonyme Klassen - Interface Allgemeine Java-Themen 5
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
J Generische Interface - Problem Allgemeine Java-Themen 3
mrBrown Namensfindung Fluent-Interface Allgemeine Java-Themen 0
J Logik in Interface Allgemeine Java-Themen 2
N Best Practice Allgemeines Verhalten für ein Interface implementieren? Allgemeine Java-Themen 7
B eigenes Consumer Interface Allgemeine Java-Themen 0
S 2 methoden mit gleichen namen und ein Interface Allgemeine Java-Themen 9
N GUI Interface, swing Allgemeine Java-Themen 7
Thallius Konzeptproblem User-Interface Allgemeine Java-Themen 5
T Interface vs abstract Allgemeine Java-Themen 2
S Klassen Abstract, Interface und ein Chat Tool Allgemeine Java-Themen 1
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
N Problem mit Generics und Interface Allgemeine Java-Themen 4
D Methode mit optionalen Parametern in Interface Allgemeine Java-Themen 3
T Interface mit generische Typen Allgemeine Java-Themen 5
M Interface einer Library implementieren Allgemeine Java-Themen 3
A Klassen ein Interface aufzwingen Allgemeine Java-Themen 4
Bananabert Interface Custom 'Event' mit Interface Allgemeine Java-Themen 10
J Interface Serializable Methodensignatur Allgemeine Java-Themen 2
J Interface Interface für Framework verwenden Allgemeine Java-Themen 4
F Interface IInterface oder Interface? Allgemeine Java-Themen 3
M Generics (bounded wildcards statt Interface Bezeichnern) -- Sinn oder Unsinn? Allgemeine Java-Themen 2
T Interface Probleme Allgemeine Java-Themen 8
M Queues und Queue Interface Allgemeine Java-Themen 3
I Mehrfaches Implementieren eines generischen Interface Allgemeine Java-Themen 9
W Java Native Interface und "mp3player" Allgemeine Java-Themen 3
M Über Liste verschiendene JComponents mit eigenem implementierten Interface ansprechen Allgemeine Java-Themen 7
P Eclipse Java Native Interface-Problem Allgemeine Java-Themen 8
Z Abstrakte Klassen /Interface Allgemeine Java-Themen 5
pg1337 Interface-Frage Allgemeine Java-Themen 24
S Interface Welchen Interface Stil favorisiert ihr? (usability) Allgemeine Java-Themen 17
faetzminator statische Variablen in Interface - Vererbung? Allgemeine Java-Themen 9
R Implementierung eines Interface durch 2 verschiedene Klassen Allgemeine Java-Themen 6
T OpenOffice Interface Elemente Ein/Ausblenden Allgemeine Java-Themen 5
K Interface Interface comparable machen Allgemeine Java-Themen 9
T Interface > Abstract > Class Allgemeine Java-Themen 11
N Trick für Compilerfehler bei fehlendem Interface Allgemeine Java-Themen 12
X Interface - Klasse einladen Allgemeine Java-Themen 6
G Interface -> InterfaceImplementierung Allgemeine Java-Themen 3
Ark Array durch Interface ersetzen Allgemeine Java-Themen 7
R Interface instanzieren Allgemeine Java-Themen 8
B Frage zu Interface und List Allgemeine Java-Themen 4
KrokoDiehl JNI: native im Interface Allgemeine Java-Themen 4
S normale vererbung als interface Allgemeine Java-Themen 2
E Beispiel für ein möglichst einfaches Interface Allgemeine Java-Themen 22
N Unterschied abstract interface und interface Allgemeine Java-Themen 4
S interface verbung problem Allgemeine Java-Themen 9
S problem programm mit interface: Allgemeine Java-Themen 3
R Vererbung mit Interface und Abstract Allgemeine Java-Themen 3
B Interface und von Thread ableiten Allgemeine Java-Themen 6
R Interface Serializable technische Begrenzung Allgemeine Java-Themen 2
T Interface-Referenz Allgemeine Java-Themen 2
L interface abstrakte klasse Allgemeine Java-Themen 21
S Interface Geschäftslokik & GUI Allgemeine Java-Themen 6
G Interface zwischen 2 Programmierern Allgemeine Java-Themen 10
C Schnittstellen(interface) Allgemeine Java-Themen 9
N List<? implements "Interface"> geht nicht Allgemeine Java-Themen 13
D javadoc interface + implementation + @overrides Allgemeine Java-Themen 16
G Interface oder abstrakte Klasse Allgemeine Java-Themen 4
T Parameter einer Klasse auf Interface prüfen Allgemeine Java-Themen 6
A feststellen, welche Klassen ein Interface implementieren Allgemeine Java-Themen 3
G class, interface, or enum exp? Allgemeine Java-Themen 2
S Interface Klasse überladen. Allgemeine Java-Themen 2
K Inneres Interface äußere Klasse Allgemeine Java-Themen 7
T Frage zu interface und "guter Programmierstil" Allgemeine Java-Themen 4
T Interface "on-the-fly" implementieren? Allgemeine Java-Themen 3
S Frage zu Interface Allgemeine Java-Themen 7
J Objektorientiert - Interface & Klassen Allgemeine Java-Themen 3
G Interface - Klassen implementieren das - Reflection ok? Allgemeine Java-Themen 4
T "Programming against the interface" sinnvoll? Allgemeine Java-Themen 18
G Interface mehrfach implementieren Allgemeine Java-Themen 5
@ zur Laufzeit Interface aus jar implementieren? Allgemeine Java-Themen 5
A Was ist der genau Sinn eines Interface? Allgemeine Java-Themen 13
E Oberbergriff für class und interface Allgemeine Java-Themen 20
D QuickSort, Interface Allgemeine Java-Themen 2
R Interface für Arithmethik? Allgemeine Java-Themen 3
MQue Interface implementieren Allgemeine Java-Themen 7
P Liste von Klassen die ein Interface implementieren speichern Allgemeine Java-Themen 12
L Interface Frage! Allgemeine Java-Themen 25
T Instanz einer Interface abgeleiteten Klasse erzeugen Allgemeine Java-Themen 3
F Ein interface und private Methoden? Allgemeine Java-Themen 13
G nichtabstrakte Funktion zu einer Interface hinzufügen Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben