Probleme mit Reflection

Meru

Bekanntes Mitglied
Hallo,

ich habe ein kleines Problem mit der Reflection API und weiß leider nicht so richtig wo dort das Problem ist.

Ich erzeuge eine Instanz von einem Interface, welches die public-Methode "showSomething(String s)" hat. Diese Instanz reiche in in eine andere Klasse wo via Reflection diese Methode ausgelöst werden soll.
Solange die 3 unten stehenden Klassen im gleichen Package sind funktioniert auch alles wunderbar. Jedoch wenn ich sie ein wenig verteilen will (also in unterschiedliche packages) kommt es zu einem Fehler und ich weiß leider nicht so genau warum.

Habt ihr da eine Idee?


Java:
package demo.blub;

public interface ITest {
	void showSomething(String s);
}

Java:
package demo.blub;

import demo.util.ReflectionClass;

public class Starter {

	public Starter() {
		ITest tester = new ITest() {
			@Override
			public void showSomething(String s) {
				System.out.println(s);
			}
		};
		ReflectionClass reflection = new ReflectionClass(tester);
	}
	
	public static void main(String[] args) {
		new Starter();
	}
}

Java:
package demo.util;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import demo.blub.ITest;

public class ReflectionClass {

	private ITest tester;
	
	public ReflectionClass(ITest tester) {
		Class c = String.class;
		
		Method targetMethod;
		try {
			targetMethod = tester.getClass().getMethod("showSomething", c);
			targetMethod.invoke(tester, new Object[]{"Hier wird etwas tolles gezeigt!!!!"});
			
		} catch (SecurityException e) {e.printStackTrace();
		} catch (NoSuchMethodException e) {e.printStackTrace();
		} catch (IllegalArgumentException e) {e.printStackTrace();
		} catch (IllegalAccessException e) {e.printStackTrace();
		} catch (InvocationTargetException e) {e.printStackTrace();}
	}
}

und erhalte folgende Fehlermeldung:
java.lang.IllegalAccessException: Class demo.util.ReflectionClass can not access a member of class demo.blub.Starter$1 with modifiers "public"
at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at demo.util.ReflectionClass.<init>(ReflectionClass.java:28)
at demo.blub.Starter.<init>(Starter.java:24)
at demo.blub.Starter.main(Starter.java:28)
 
G

Gast2

Gast
Du kannst/musst die Methode noch accessible setzen:
Java:
            targetMethod = tester.getClass().getMethod("showSomething", c);
            targetMethod.setAccessible(true);
            targetMethod.invoke(tester, new Object[]{"Hier wird etwas tolles gezeigt!!!!"});
 

Meru

Bekanntes Mitglied
Vielen dank für diesen Hinweis, damit funktioniert es bestens.

Kannst du sagen warum man das machen muss und in der anderen Varainte (alles in einem Package) nicht?
 

Meru

Bekanntes Mitglied
Was meinst du mit "nicht public"? Weil ich es lokal erzeugt habe?
In meinem richtigen Programm habe eine "public abstract class", welches dieses Interface implementiert (ähnlich wie MouseAdapter) und habe dort das gleiche Problem obwohl die Klasse ja ansich public ist.

Zu dem Kurzbeispiel:
Der Umkehrschluss um es public zu machen wäre dann wohl das Interface direkt zu implementieren? Zumindest hab ich das gerade mal so probiert und es funktioniert auf diese Weise.
 
S

SlaterB

Gast
wieso ist das Thema 'erledigt'?

> Der Umkehrschluss um es public zu machen wäre dann wohl das Interface direkt zu implementieren? Zumindest hab ich das gerade mal so probiert
ist dein Beispiel im ersten Posting nicht gerade 'das Interface direkt zu implementiert'?

ich habe deinen Code bei mir kopiert
Java:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        new Starter();
    }

    public interface ITest
    {
        void showSomething(String s);
    }

    class ITest2
        implements ITest
    {

        public void showSomething(String s)
        {
            System.out.println(s);
        }
    }
}


class Starter
{

    public Starter()
        throws Exception
    {
        ITest2 tester = new Test().new ITest2();
        ReflectionClass reflection = new ReflectionClass(tester);
    }

}
+ ReflectionClass in anderem package,

so wie es jetzt steht gehts nicht, wenn in Zeile 15 das public dazu kommt, dann gehts,
'public static' geht auch, mal abgesehen davon dass Zeile 33 dann noch anzupassen ist
 

Meru

Bekanntes Mitglied
Hab es erst einmal auf erledigt gesetzt weil es ja mit der Lösung von EikeB funktioniert

Mit direkt implementieren meinte ich "public class Starter implements ITest".

Also dadurch wird das Object "public". Wenn ich es "Annonymous inner Type" mache (wie in meinem ersten Beispiel) ist das konkrete Objekt nicht public, obwohl mein Interface/Abstakte Klasse aber eigentlich public sind. Ich muss das Objekt also vorher auf public setzen?
Nur das kann es auch nicht sein, dann würde ja nachfolgendes auch gehen, was es aber nicht tut

Java:
package demo.blub;
 
import demo.util.ReflectionClass;
 
public class Starter {
	
	 public ITest tester = new ITest() {
		@Override
		public void showSomething(String s) {
			System.out.println(s);
		}
	 };
 
    public Starter() {
        ReflectionClass reflection = new ReflectionClass(tester);
    }
    
    public static void main(String[] args) {
        new Starter();
    }
}
 

Wildcard

Top Contributor
Mit dem Objekt hat das nichts zu tun, ein Objekt kann nicht 'public' sein.
Dein Problem ist die Klasse und die ist nicht public wenn du sie anonym definierst. Die Sache mit setAccessible geht übrigens furchtbar schief wenn ein SecurityManager ins Spiel kommt, daher versucht man sowar unbedingt zu vermeiden.
Kannst du mal den Use-Case beschreiben den du mit dem Konstrukt abdecken möchtest? Es gibt fast immer eine bessere Lösung als Java Reflection...
 

Meru

Bekanntes Mitglied
Ah, nu hab ichs halbwegs verstanden, vielen Dank für die Aufklärungen und Links.

Zum UseCase:
Ich habe mehrere WebServices und ein jeder solcher hat beliebig viele Funktionen unterschiedlichen Names. Um einen WebSerive anzusprechen muss man ja immer ein wenig Implementationsarbeit leisten, gerade auch wenn es im Thread ablaufen soll.

Wir haben da z.B.
WSArtikel
- getArtikelList(...);
- getArtikel(...);
- removeArtikel(...);
- ....

WSBestand
- getBestand(...)
- editBestand(...)
- ....

Meiner Implementierung (Logik-Model) soll es dabei egal sein wie das im Hintergrund gemacht wird. Hierfür brauche ich also eine
Art CallHandler zum ausführen der Services sowie auch ein Interface für die Rückgabe-Methoden, damit mein Logik-Model die Werte auch empfangen kann (Thread-Style).

Nun habe ich im CallHandler für WSArtikel ca. 20 Methoden definiert, welches dementsprechend auch 20 Rückgaben hat.

Nun war meine Überlegung folgende:
Ich will eigentlich so wenig Code wie möglich doppeln (auch wenn es generierter Code ist).
Ohne Reflection müsste jeder WebServiceAufruf im CallHandler die genaue Rückgabefunktion aus dem Interface kennen. Zudem kommt hinzu, das ein CallHandler beliebig viele "Listener" haben soll oder aber nur auf einen bestimmten Listener die Rückgabe machen (wenn ein konkreter Listener übergeben wird)

Bsp (Pseudecode)
Java:
public void callService_getArtikel(ArtikelQuery query, IArtikelResponse response){
	CallObject co = new CallObject(){
		Artikel r;
		public String getOperationName() {return "getArtikel";}

		public void call(){
			// führe call aus (r = webserive.getArtikel)
		}
		public void success(){
 			if (response == null){
				for (int i=0; i < listenerList.size(); i++){
					listener.get(i).artikelResponse(r);
				}
			}else{
				response.artikelResponse(r);
			}
		}
		public void failure(Exception e){
			if (response == null){
				for (int i=0; i < listenerList.size(); i++){
					listener.get(i).failure(e, getOperationName();
				}
			}else{
				response.failure(e, getOperationName();
			}
	wscaller.call(co);
	}
}


Mir geht es dabei um die "success"- und die "failure"-Methode.
Ich habe insgesamt 20 Services zu je 5-20 Methoden. Das ist halt eine sehr häufige CodeVerdoppelung.
Daher wollte ich über Reflection gehen und sagen:
Java:
	public void success() {
		WSArtikelCallHandler.this.serviceAuswertung(getOperationName(), result, responseObject);
	}
	public void failure(Exception e) {
		WSArtikelCallHandler.this.failure(e, getOperationName(), responseObject);
	}

Somit wäre es dann deutlich schlanker vom Cellcode her und auch keine Doppelung.


Mir will da nicht richtig einfallen, wie ich es anders machen kann ohne diese CodeDoppelung. Aber da es generiert ist, kann es mir eigentlich egal sein. Diese Klassen soll ja eh keiner anfassen und kann bei Bedarf ja auch anders Implementiert werden. Genau deswegen will ich es ja von meinem Model trennen, falls sich die Schnittstelle zum Server mal irgendwann ändern sollte.
 
Zuletzt bearbeitet:

Wildcard

Top Contributor
Deine Beschreibung habe ich um ehrlich zu sein nur bedingt verstanden (obwohl sie ja recht ausführlich war). Von dem was ich verstanden habe, scheint mir das Command Pattern allerdings ein geeigneter Ersatz zu sein (und anders als bei Reflection verlierst du die Compile Time Sicherheit nicht).
Command Pattern | Object Oriented Design
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
C Probleme mit dem Zugriff auf private Methode per reflection Allgemeine Java-Themen 2
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
C Probleme mit javax.mail.Session Allgemeine Java-Themen 8
M tomcat probleme Allgemeine Java-Themen 1
N Division macht Probleme Allgemeine Java-Themen 14
MarvinsDepression Probleme mit relativem Dateipfad Allgemeine Java-Themen 1
G Geotools Probleme nach PC-Wechsel Allgemeine Java-Themen 6
nibe1501 GUI Probleme Allgemeine Java-Themen 16
C Probleme mit dem WindowBuilder Allgemeine Java-Themen 3
P Selenium . Probleme ein Iron Icon Element anzusprechen Allgemeine Java-Themen 2
B Compiler-Fehler Probleme beim Kompilieren mit Jsoup Allgemeine Java-Themen 8
K VisualVM Profiling Remote Probleme Allgemeine Java-Themen 1
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
M Probleme bei Eclipse wenn ich entpacke Allgemeine Java-Themen 15
D Regex Probleme Allgemeine Java-Themen 2
M Probleme jar datei. Allgemeine Java-Themen 2
L Vererbung Verständnis Probleme Vererbung Allgemeine Java-Themen 2
Dann07 Probleme mit OpenAL Allgemeine Java-Themen 0
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
V Compiler-Fehler Online Compiler Probleme Allgemeine Java-Themen 4
M Probleme mit Negamax-Algorithmus Allgemeine Java-Themen 29
M Probleme mit BigDecimal Allgemeine Java-Themen 1
T Probleme mit NumberFormat Allgemeine Java-Themen 5
J Probleme exe-Start mit Task Scheduler Allgemeine Java-Themen 1
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
K Data Konverter - Probleme mit Byte[] Kodierung Allgemeine Java-Themen 3
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
H Swing HashMap zu Tabelle macht mir Probleme Allgemeine Java-Themen 4
Neoline Interpreter-Fehler Probleme mit Arrays.toString Allgemeine Java-Themen 7
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
J Erste Schritte Probleme mit der Hauptklasse Allgemeine Java-Themen 14
J Tetris Probleme bei Klassen Allgemeine Java-Themen 14
J MinMax VierGewinnt Probleme Allgemeine Java-Themen 22
J Probleme mit CodeCoverage und Lombok Equals Allgemeine Java-Themen 1
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
R Snake Probleme Allgemeine Java-Themen 2
A Probleme beim Verstehen einer Aufgabenstellung Allgemeine Java-Themen 11
RalleYTN 3D Objekt Translation basierend auf Rotation (Probleme mit Z Rotation) Allgemeine Java-Themen 0
Bluedaishi Druck Probleme mit PDF dateien Allgemeine Java-Themen 4
G Ant Probleme bei einer Installation die Apache ant+ivy verwendet Allgemeine Java-Themen 14
E TableView Probleme Allgemeine Java-Themen 7
perlenfischer1984 Probleme beim Mocken Allgemeine Java-Themen 6
S Kaffemaschine Programmierung Probleme Allgemeine Java-Themen 2
K Threads Runtime und Process Probleme Allgemeine Java-Themen 3
S Probleme mit unterschiedlichen Java-Versionen (Mac OS X 10.11) Allgemeine Java-Themen 0
S Event Handling keyPressed()-Probleme Allgemeine Java-Themen 2
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
P Probleme mit Grafik (Java) Allgemeine Java-Themen 6
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
H Probleme mit DAY_OF_WEEK Allgemeine Java-Themen 4
Arif Probleme mit NullPointerException Allgemeine Java-Themen 2
E Probleme mit nextInt() und Exception Allgemeine Java-Themen 35
Streeber Probleme mit AWT-EventQueue: ArrayList Elemente hinzufügen Allgemeine Java-Themen 1
D Performance-Probleme mit Joda-Time Allgemeine Java-Themen 3
M Probleme beim rechnen, bei Zahlen mit führenden Nullen. Allgemeine Java-Themen 7
RalleYTN Probleme mit Encrypting Allgemeine Java-Themen 10
M Probleme mit Schriftarten PDFBox Allgemeine Java-Themen 3
J Probleme mit der Java-Runtime Allgemeine Java-Themen 10
G Probleme mit BufferedWriter und URL Allgemeine Java-Themen 4
S Probleme mit meinem MacBook Pro DRINGEND HILFE erbeten! Allgemeine Java-Themen 17
Androbin Interpreter-Fehler Probleme mit Rekursion - StackOverflowError Allgemeine Java-Themen 8
E JCuda-0.6.5 Probleme beim ausführen der Datei Allgemeine Java-Themen 0
M Runtime.exec() verursacht auf manchen Systemen Probleme - Ursache unklar Allgemeine Java-Themen 2
W JNDI - LDAP - Probleme beim editieren von Usern Allgemeine Java-Themen 0
R DBUnit Performance Probleme Allgemeine Java-Themen 0
S Probleme mit Collection Allgemeine Java-Themen 7
L Probleme mit Jar Allgemeine Java-Themen 6
N Zahlensysteme umrechnen; Probleme beim Umwandeln Allgemeine Java-Themen 4
K OOP OOP Gui Spiel + Vererbungen Probleme durch Nichtwissen!! Allgemeine Java-Themen 1
F Java Native/Shared Library (.so) laden macht Probleme Allgemeine Java-Themen 3
J Synchronized Probleme Allgemeine Java-Themen 7
J Java Progressbar & Download Probleme Allgemeine Java-Themen 10
S Probleme mit dem filechooser Allgemeine Java-Themen 1
J Comperator Probleme Allgemeine Java-Themen 4
A Probleme beim auslesen von Quelltext (HTML) Allgemeine Java-Themen 5
S Probleme mit Webappplikation Allgemeine Java-Themen 5
L Plötzlich Probleme mit der JVM :( Allgemeine Java-Themen 6
S starke performance probleme des forums Allgemeine Java-Themen 10
K Probleme bei Berechnung der Komplexität Allgemeine Java-Themen 7
R JRE Ablaufdatum seit 7u10 - Probleme bei selbst ausgelieferter JRE bekannt? Allgemeine Java-Themen 3
H Reg Exp Probleme Allgemeine Java-Themen 5
M Classpath Probleme bei JAR Generierung Allgemeine Java-Themen 2
S Probleme mit JAVA-Installation Allgemeine Java-Themen 3
D Probleme bei for-Schleife Allgemeine Java-Themen 4
R Probleme mit Javadoc Allgemeine Java-Themen 2
G Gson Probleme Allgemeine Java-Themen 2
P KI für TicTacToe programmieren > Probleme Allgemeine Java-Themen 2
M Google App Engine macht Probleme Allgemeine Java-Themen 4
H Probleme mit finally-Block und close() Allgemeine Java-Themen 4
F 2d array probleme Allgemeine Java-Themen 2
M 3D-Grafik Probleme beim drehen von Objekten Allgemeine Java-Themen 9
T Interface Probleme Allgemeine Java-Themen 8
C Eclipse Probleme bei selbst erstelltem Algorithmus Allgemeine Java-Themen 2
M Probleme mit String in Label übergeben. Allgemeine Java-Themen 6
H MediaManager Fragen/Probleme Allgemeine Java-Themen 6
U Probleme mit Kopiervorgang Allgemeine Java-Themen 3

Ähnliche Java Themen


Oben