[Reflection + WebService] Methodenaufruf an einem Proxy

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Ich habefolgendes Problem:

Ich möchte per Reflection auf einen WebService zugreifen -hört sich komisch an, is aber nun mal so :roll:

Ich hab mir die Stubs generieren lassen und nun möchte ich recht generisch auf diese Stubs zugreifen können...

Die Syntax der Methode sieht wie folgt aus:

Code:
public void testServiceReflection(String serviceName, String port, String method) {...}

Ich hab mir nun per Reflection die ServiceClass besorgt und ich kann dort auch die Methode aufrufen, die mir dann das Interface zurückgibt, um Schlussendlich auf den WebService zuzugreifen.

Nur hier liegt das Problem:
Da ich keine Klasse zurückbekomm, sondern einen Proxy (da es sich ja um ein Interface handelt) kann ich daran nicht wie gewöhnlich mit .invoke() einen Methodenaufruf absetzen...

Meine Frage ist nun also, wie ich an diesem Proxy einen Methodenaufruf absetzen kann :?:

Hier noch der komplette Code:
Code:
public void testServiceReflection(String serviceName, String port, String method) throws Throwable {
    	Class<?> serviceClass = null;

    	Class<?> implementingClass = null;
    	
    	Method accessImplementation =  null;
    	Method webServiceMethod = null;
    	
    	// first get the serviceClass
    	try {
    		// search for the class in the package "client"
    		serviceClass = Class.forName( "client."+serviceName );
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		// return if there is no suitable class
		if(serviceClass == null) return;
		
		// The parameterlist of the method accessImplementation
		Class[] parameterTypes_accessImplementation = new Class[] {};
		
		Object[] arguments_accessImplementation = new Object[] {};
		
		try {
			accessImplementation = serviceClass.getMethod("get"+port, parameterTypes_accessImplementation);

			implementingClass = (accessImplementation.invoke(serviceClass.newInstance(), arguments_accessImplementation)).getClass();
		} catch (Exception e) {
			e.printStackTrace();
		}

		
		webServiceMethod = implementingClass.getMethod(method, parameterTypes);
		System.out.println("The webservice method :" +webServiceMethod.getName());
		
		try {
			
	                            // HIER sollte der Aufruf rein... also ein Methodenaufru an die implementingclass...
		} catch (Exception e) {
			e.printStackTrace();
		}
		

		
    	
    	
    }

Aufgerufen wird die Methode wie folgt:
Code:
testServiceReflection("CalculatorService", "CalculatorPort", "addValues");

Hier noch die Klasse CalculatorService
Code:
package client;

import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceFeature;


/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.1.1 in JDK 6
 * Generated source version: 2.1
 * 
 */
@WebServiceClient(name = "CalculatorService", targetNamespace = "http://service/", wsdlLocation = "http://localhost:8080/calculator?wsdl")
public class CalculatorService
    extends Service
{

    private final static URL CALCULATORSERVICE_WSDL_LOCATION;

    static {
        URL url = null;
        try {
            url = new URL("http://localhost:8080/calculator?wsdl");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        CALCULATORSERVICE_WSDL_LOCATION = url;
    }

    public CalculatorService(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);
    }

    public CalculatorService() {
        super(CALCULATORSERVICE_WSDL_LOCATION, new QName("http://service/", "CalculatorService"));
    }

    /**
     * 
     * @return
     *     returns Calculator
     */
    @WebEndpoint(name = "CalculatorPort")
    public Calculator getCalculatorPort() {
        return (Calculator)super.getPort(new QName("http://service/", "CalculatorPort"), Calculator.class);
    }

    /**
     * 
     * @param features
     *     A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy.  Supported features not in the <code>features</code> parameter will have their default values.
     * @return
     *     returns Calculator
     */
    @WebEndpoint(name = "CalculatorPort")
    public Calculator getCalculatorPort(WebServiceFeature... features) {
        return (Calculator)super.getPort(new QName("http://service/", "CalculatorPort"), Calculator.class, features);
    }

}

sowie das Interface

Code:
package client;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;


/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.1.1 in JDK 6
 * Generated source version: 2.1
 * 
 */
@WebService(name = "Calculator", targetNamespace = "http://service/")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface Calculator {


    /**
     * 
     * @param arg1
     * @param arg0
     * @return
     *     returns long
     */
    @WebMethod
    @WebResult(partName = "return")
    public long addValues(
        @WebParam(name = "arg0", partName = "arg0")
        int arg0,
        @WebParam(name = "arg1", partName = "arg1")
        int arg1);

}

Der webService läuft und ein normaler Aufruf daran mit diesengenerierten Klassen klappt auch wunderbar. Nur an diesem Proxy komm ich eben nicht weiter... ???:L
 
S

SlaterB

Gast
> Da ich keine Klasse zurückbekomm, sondern einen Proxy (da es sich ja um ein Interface handelt) kann ich daran nicht wie gewöhnlich mit .invoke() einen Methodenaufruf absetzen...

gibts dafür auch einen Grund oder eine Fehlermeldung?
was soll da der Unterschied sein?
 
G

Guest

Gast
Na ja, warum das so ist, kann ich auch nur erahnen...
Da der Methodenaufruf "getCalculatorPort" als Rückgabewert "Calculator" hat und dies eben ein Interface und keine Klasse ist...

Das Problem an dem Proxy ist es, dass das normale invoke so nicht funktioniert:

Code:
webServiceMethod.invoke(implementingClass, arguments);

Liefert:

Code:
java.lang.IllegalArgumentException: object is not an instance of declaring class
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at client.CalculatorClient.testServiceReflection(CalculatorClient.java:73)
	at client.CalculatorClient.main(CalculatorClient.java:16)

wenn ich dann wie beim obigen invoke ein .newInstance() mit einbau, also:

Code:
webServiceMethod.invoke(implementingClass.newInstance(), arguments);

Bekomm ich folgene Exception:
Code:
java.lang.InstantiationException: $Proxy22
	at java.lang.Class.newInstance0(Unknown Source)
	at java.lang.Class.newInstance(Unknown Source)
	at client.CalculatorClient.testServiceReflection(CalculatorClient.java:73)
	at client.CalculatorClient.main(CalculatorClient.java:16)

So weit ich mich bisher durchgegooglet hab muss an so einem Proxy der Aufruf über einen InvocationHandler erfolgen - also dort muss das invoke aufgerufen werden. Nur komm ich an diesen nicht / bzw.hab ich keine Möglichkeit gefunden, diesen zu bekommen... :roll:
 
S

SlaterB

Gast
hmm hmm,

> webServiceMethod = implementingClass.getMethod(method, parameterTypes);
+
> webServiceMethod.invoke(implementingClass, arguments);

macht ja schon mal gar keinen Sinn, die Methode kannst du nur an einem Objekt der Klasse ausrufen, nicht am Klassen-Objekt selber

und Proxy-Objekte erstellt man doch auch im normalen Ablauf nicht selber über einen Konstruktor,
das Objekt muss von von irgendwoher kommen,
wenn du es nicht hast, dann geht gar nix, weder normaler Zugriff noch Reflection,



programmiere doch erstmal einen normalen WebService-Zugriff, danach dann irgendwas komisches,
aber vielleicht habe ich auch das grundsätzliche Vorgehen noch nicht ganz verstanden



edit:
wie kommst du dann überhaupt an die Proxy-Klasse?

> implementingClass = (accessImplementation.invoke(serviceClass.newInstance(), arguments_accessImplementation)).getClass();

hast du hier nicht das Proxy-Objekt, an welchem du dann getClass() aufrufst?
 

Wildcard

Top Contributor
Moment, moment...
Du hast im Clients die Service Interfaces und die Implementierung auf dem Server, richtig?
Wie willst du auf dem Client eine Methode aufrufen, wenn der Client die Implementierung gar nicht hat?
 
G

Guest

Gast
Da ich ja über das Interface dann auf generierte Stubs zugreifen will, dürfte das nicht der Knackpunkt sein.
Bei einem webService muss die Implementierung der Methoden ja auf dem Server leigen - darum hab ich ja auch nur das Interface...

Folgendes funktioniert ja ohne Probleme:

Code:
CalculatorService service = new CalculatorService();
Calculator calculator = service.getCalculatorPort();
System.out.println("Summe: " + calculator.addValues(17, 13));

Nur eben schaff ich es nicht, diese WebServiceaufrufe per Reflection generisch hinzubekommen.

Ich komm per Reflection bis an den Punkt wie oben mit calculator.addValues(17,13) nur eben schaff ich es nicht diesen Aufruf auszuführen, da ich das invoke wie beschreiben nicht hinbekomm...
Ich hab mich schon ne Weile versucht darüber schlau zu machen :###

So bin ich dann auch auf den InvocationHandler gestoßen, ich denk, dass es mit dem was zu tun hat, allerdings steig ich noch nicht so ganz durch.
 
S

SlaterB

Gast
wie gesagt bzw. zuletzt editiert, denke ich, dass du den Proxy schon hast:

> implementingClass = (accessImplementation.invoke(serviceClass.newInstance(), arguments_accessImplementation)).getClass();

Object proxy = accessImplementation.invoke(serviceClass.newInstance(), arguments_accessImplementation);
implementingClass = proxy.getClass();
 
G

Guest

Gast
Ich würd das ganze ja gern über einen normalen WebServiceAufruf machen... :roll:

Aber da bei der ganzen Geschichte eine zumindest teilgenerische Klasse rauskommen soll, die mit wenig Information einen WebServiceAufruf absetzt, geht das leider nicht.

Bei folgendem Aufruf bekomm ich den Proxy zurück:

Code:
implementingClass = (accessImplementation.invoke(serviceClass.newInstance(), arguments_accessImplementation)).getClass();

Denn ein:
Code:
System.out.println(Proxy.isProxyClass(implementingClass));
liefert true zurück - ich bekomm da also definitiv einen Proxy zurück und da lässt sich natürlich, wie du auch geschrieben hast, keine Instanz davon machen.
Deswegen muss der Umweg irgendwie über diesen InvocationHandler gehen - aber wie ???:L
 
S

SlaterB

Gast
hallo, liest du auch meine Posts? z.B. den letzten mit

Object proxy = accessImplementation.invoke(serviceClass.newInstance(), arguments_accessImplementation);
implementingClass = proxy.getClass();

du brauchst kein new Instance, du hast schon einen Proxy
 
G

Guest

Gast
Also du meinst:

Code:
accessImplementation = serviceClass.getMethod("get"+port, parameterTypes_accessImplementation);
Object proxy = accessImplementation.invoke(serviceClass.newInstance(), arguments_accessImplementation);
Dann
Code:
implementingClass = proxy.getClass();
Und den Aufruf ohne newInstance mittels:
Code:
webServiceMethod.invoke(implementingClass, arguments);

Wenn ich dich richtig verstanden habe...
Dann bekomm ich allerdings folgende Exception:
Code:
java.lang.IllegalArgumentException: object is not an instance of declaring class
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at client.CalculatorClient.testServiceReflection(CalculatorClient.java:108)
	at client.CalculatorClient.main(CalculatorClient.java:17)

Wobei sich die Exception genau auf den obigen Abschnitt : webServiceMethod.invoke(implementingClass, arguments); bezieht.
 
S

SlaterB

Gast
soweit waren wir schon am Anfang (wofür brauchs man dann überhaupt den Proxy?),
versuchs nun mal richtig:

webServiceMethod.invoke(proxy, arguments);

!!
;)
 
G

Guest

Gast
SlaterB hat gesagt.:
soweit waren wir schon am Anfang (wofür brauchs man dann überhaupt den Proxy?),
versuchs nun mal richtig:

webServiceMethod.invoke(proxy, arguments);

!!
;)

Danke :cool:

Nu hab ichs glaub kappiert - es geht jetzt.
Ich hab vor lauter Bäumen schon den Wald nicht mehr gesehen :wink:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Reflection gone wrong? Allgemeine Java-Themen 21
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
J Reflection Aufruf: .class durch .dll ersetzen Allgemeine Java-Themen 4
T Reflection - Abprüfen von Klasseneigenschaften Allgemeine Java-Themen 3
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
J Reflection-Method Hook? Allgemeine Java-Themen 14
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
X public Getter ersetzen (Reflection?!) Allgemeine Java-Themen 3
A Reflection Problem Allgemeine Java-Themen 15
K Generic class und Reflection Allgemeine Java-Themen 2
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
N Per Reflection auf (method) local inner class zugreifen? Allgemeine Java-Themen 3
E Reflection? Frage Allgemeine Java-Themen 4
B Reflection, invoke dynamisch befüllen Allgemeine Java-Themen 3
T Reflection Allgemeine Java-Themen 11
G Klassen Cast auf Argumentenklasse via Reflection? Allgemeine Java-Themen 10
H Collections Generics und Reflection Allgemeine Java-Themen 6
TheWhiteShadow Reflection-Lösung für Objektkopien Allgemeine Java-Themen 3
B Reflection: getMethods schlägt fehl (NoClassDefFoundE)) Allgemeine Java-Themen 15
P Reflection "Cast" Allgemeine Java-Themen 5
D Reflection-Performance Allgemeine Java-Themen 7
S Reflection und Generic Allgemeine Java-Themen 9
W Reflection -> getMethod bei optionalen Parametern Allgemeine Java-Themen 4
Kr0e Reflection - Instanz einer Klasse erstellen, ohne Default-Constructor Allgemeine Java-Themen 15
C Probleme mit dem Zugriff auf private Methode per reflection Allgemeine Java-Themen 2
C Zugriff auf private Methode per reflection geht nicht mehr Allgemeine Java-Themen 3
M Probleme mit Reflection Allgemeine Java-Themen 10
A Reflection Konstruktor Parameter Supertyp Allgemeine Java-Themen 2
D Vererbung, Reflection und automatischer Methodenaufruf Allgemeine Java-Themen 24
G Java Reflection Allgemeine Java-Themen 11
N Reflection: NoSuchMethodException obwohl Methode existiert Allgemeine Java-Themen 2
brunothg Problem mit Reflection Allgemeine Java-Themen 6
M reflection in inner classes Allgemeine Java-Themen 7
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
V Reflection - Field-Instanz und Annotations Allgemeine Java-Themen 6
Y Reflection und "extends" Schlüsselwort Allgemeine Java-Themen 3
R Reflection Problem Allgemeine Java-Themen 4
N getName() of reflection Object Allgemeine Java-Themen 4
P Reflection - Wie rufe ich die Felder einer Klasse in einer Methode der Basisklasse? Allgemeine Java-Themen 4
M Reflection Queue auslesen Allgemeine Java-Themen 6
N generic reflection Allgemeine Java-Themen 5
megachucky Java Reflection -> versteckte Felder finden? Allgemeine Java-Themen 3
MQue Reflection Exception Allgemeine Java-Themen 11
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
ruutaiokwu Per Reflection membervariablen überschreiben / zuweisen / nullen Allgemeine Java-Themen 5
T Zugriff per Reflection o.ä. möglich? Allgemeine Java-Themen 18
R Reflection: Membervariablen-Initialwerte Allgemeine Java-Themen 4
G Reflection Allgemeine Java-Themen 6
V reflection in java 5 und 6 Allgemeine Java-Themen 2
C Reflection Übergabeparamter überprüfen? Allgemeine Java-Themen 3
Ark Konstruktor per Reflection nicht bekannt Allgemeine Java-Themen 4
Q Objekte durch Reflection erzeugen Allgemeine Java-Themen 18
T Parameternamen mit Reflection-API Allgemeine Java-Themen 14
M reflection mit parametern Allgemeine Java-Themen 8
M Reflection Frage Allgemeine Java-Themen 7
G Code vereinfachen bei Reflection Allgemeine Java-Themen 4
I reflection get inner static classes Allgemeine Java-Themen 2
C Reflection Allgemeine Java-Themen 12
Y Reflection - wie kann ich eine Methode benutzen Allgemeine Java-Themen 4
Y Reflection - wie anwenden/benutzen bei folgendem Problem Allgemeine Java-Themen 3
P Java Reflection API - ResultDataModel ? Allgemeine Java-Themen 3
R Object Dynamisch erzeugen (Reflection API) Allgemeine Java-Themen 22
N Design-Frage: persistent machen per Reflection Allgemeine Java-Themen 3
G Reflection: aktuelle bzw umschliessende Methode? Allgemeine Java-Themen 7
G per Reflection auf private Klassenattribute zugreifen? Allgemeine Java-Themen 9
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
M per reflection private attributsnamen auslesen Allgemeine Java-Themen 3
G Interface - Klassen implementieren das - Reflection ok? Allgemeine Java-Themen 4
C Reflection Problem! Allgemeine Java-Themen 2
G Object cast via Reflection Allgemeine Java-Themen 8
T Reflection und Typsicherheit Allgemeine Java-Themen 5
Q Umgang mit Reflection Allgemeine Java-Themen 4
S reflection Allgemeine Java-Themen 12
X Reflection performant? Allgemeine Java-Themen 11
M Reflection und Serializable Allgemeine Java-Themen 5
A Reflection - Variablen innerhalb einer Methode ermitteln Allgemeine Java-Themen 9
F Performance von Reflection vs Statisches Coden Allgemeine Java-Themen 4
the[V]oid Primitive Arrays per Reflection erzeugen? Allgemeine Java-Themen 2
W Package via Reflection parsen Allgemeine Java-Themen 4
R Interface mittels Reflection implementieren Allgemeine Java-Themen 8
M reflection Integer != int ? Allgemeine Java-Themen 3
M reflection invoce Allgemeine Java-Themen 3
K Reflection:Zugriff auf innere Klassen Allgemeine Java-Themen 4
N NoSuchMethodException bei Reflection-Versuch, aber warum? Allgemeine Java-Themen 3
byte Methodenaufruf per Reflection? Allgemeine Java-Themen 2
M Generics und Reflection Allgemeine Java-Themen 3
M Array per Reflection manipulieren Allgemeine Java-Themen 5
M Klassen von ausserhalb des Jars per Reflection nachladen Allgemeine Java-Themen 2
thE_29 Reflection Allgemeine Java-Themen 6
M statische Methode per reflection aufrufen Allgemeine Java-Themen 2
B Frage zu Reflection Allgemeine Java-Themen 3
V Reflection - Problem Allgemeine Java-Themen 3
clemson Reflection Interface Allgemeine Java-Themen 4
G mit reflection an die felder einer klasse rankommen Allgemeine Java-Themen 4
N Reflection: An Package einer .class-Datei kommen Allgemeine Java-Themen 2
N Reflection: Feststellen ob eine Klasse abstract ist Allgemeine Java-Themen 3
B Reflection Allgemeine Java-Themen 10
C Reflection und variable casten ! Allgemeine Java-Themen 10
C Reflection - Kurze Beschreibung? Allgemeine Java-Themen 3
F Frage zum Thema Reflection Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben