Problem bezüglich reflection

Status
Nicht offen für weitere Antworten.

Wolfone

Mitglied
also...ich steh mal wieder ein wenig auf dem schlauch.

ich soll eine Klasse programmieren, die zwei methoden enthält:

void gebtSelbstauskunft(Object[] a) : soll testen ob in dem mitgegebenen array von objekten eines dieser objekte eine parameterlose methode hat, die das suffix "Info" enthält
und falls diese beiden dinge zutreffen diese methode ausführen.

string gemeinsamerVorfahr(Object a, Object b) : soll zwei objekte erhalten und den namen der speziellsten gemeinsamen oberklasse zurückgeben.


für ersteres hatte ich eine idee, die wie folgt aussieht:

Java:
public class Selbsterkenntnis {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Object [] test = new Object[3];
        test[0] = new schnitzel();
        test[1] = new bauern();
        test[2] = new braubier();
        gebtSelbstauskunft(test);
	}


	
	static void gebtSelbstauskunft (Object [] a){
		for (int i=0; i<=a.length-1; i++){
			Class class_i = a[i].getClass();
			Method[] methods = class_i.getMethods();

			for (int p=0; p<=methods.length-1; p++){
				Class[] parameter = methods[p].getParameterTypes();
				String methodname = methods[p].getName();
				System.out.println(methodname);
				System.out.println(parameter.length);
				if ((parameter.length==0)&&(methodname.contains("Info"))){
					try {
						methods[i].invoke(a[i]);
					}
					catch (IllegalAccessException e) {
						System.out.println(e);
					}
					catch (InvocationTargetException e) {
				    	System.out.println(e);	
					}
				}
			}
			
		}
	}

}

das was am anfang in der mainmethode ist ist ein testarray von objekten, bei denen schnitzel und braubier je eine methode enthalten, die die bedingungen von gebtselbstauskunft() befriedigen würden, aber es funzt nicht...

System.out.println(methodname);
System.out.println(parameter.length);


habe ich hinzugefügt um zu testen ob die methodennamen überhaupt das sind was sie sein sollten, aber da kommt auhc nur müll bei rum....

wäre extrem cool, wenn da jemand helfen könnte

hier noch schnitzel und braubier (bauern enthält nur seinen eigenen konstruktor):
Java:
public class schnitzel {
	schnitzel(){
	}
	void sagenInfo(){
		System.out.println("hab eins");
	}
}

Java:
	class braubier{
		braubier(){}
		void nochwasInfo(){
			System.out.println("hab noch was");
		}
	}

für die zweite habe ich noch keine wirkliche idee.
 
S

SlaterB

Gast
Java:
public Method[] getMethods()
                    throws SecurityException

    Returns an array containing Method objects reflecting all the 
---------->public<-------- 
member methods of the class or interface represented by this Class object, [..]
Class (Java 2 Platform SE v1.4.2))

aber keine Sorge, Class bietet noch mehr,
einfach mal weitere Methoden ausprobieren/ nachlesen, besonders welche, die Method[] zurückgeben

> aber da kommt auhc nur müll bei rum....

bisschen genauer wäre recht hilfreich

> methodname.contains("Info"))

es gibt sogar String.endsWith(String)

> für die zweite habe ich noch keine wirkliche idee.

eine oder mehrere andere Methoden von Class geben Infos über Superklassen usw.,
die Mehrzahl ist jetzt gar nicht mal eine weitere Ausprobier-Aufgabe,
ich weiß im Moment schlicht nicht, welche die beste Methode dafür ist ;)

am besten wäre, wenn diese in der richtigen Reihenfolge alle Superklassen auflistet, dann wäre diese Liste leicht der Reihenfolge nach durchzugehen,
ansonsten alle gemeinsamen Klassen testen und von denen die nehmen, die die meisten Superklassen hat bzw. die anderen Superklassen,
auf Papier ein Beispiel aufmalen, das Konzept könnte dann klar werden
 

Wolfone

Mitglied
mit "kommt nur müll rum" meine ich:

einige nullen und hier und da ne 1 (was irgendwie unlogisch ist, da da theoretisch zweimal eine 0 ausgegeben werden müsste, weil ich ja nach der länge der felder frage in denen die parametertypen gespeichert werden, die nunmal 0 sein müssten, weil keine methoden vorhanden sind, die parameter enthalten und 2 methoden vorhanden sind)


desweiteren je einmal ein : toString, notify und notifyAll, wo eingentlich sagenInfo und nochwasInfo stehen müsste


auf jeden schonmal danke fürs bearbeiten!



EDIT: das mit dem method stimmt natürlich ist auch geändert, hat jedoch keinen effekt auf beschriebenen müll, dader ja bereits vorher entsteht, wenn ich teste, was der mir alles in mein methods-array reinschreibt...und da steht halt inzwischen benannter unsinn drin.
 
Zuletzt bearbeitet:

Schandro

Top Contributor
weil keine methoden vorhanden sind, die parameter enthalten und 2 methoden vorhanden sind
Jede Klasse erbt von Object. Und in Object sind nun mal ein paar Methoden definiert, z.b. toString, notify und notifyAll. Es gibt dort auch ein paar Methoden die Parameter erwarten.
 

Wolfone

Mitglied
ok..das macht sinn im bezug auf die aufgelisteten methoden, aber dann müssten doch die namen der von mir geschriebenen methoden in schnitzel und braubier auch aufgelistet werden, aber das sind sie nicht, was ich ehrlich gesagt nicht verstehe.
 

Schandro

Top Contributor
Probier mal den Code aus:
Java:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

public class Reflektieren {
	public static void main(String[] args) {
		test(new Bla(),new BlaBlubb());
	}
	
	public static void test(Object... objects){
		for(int i=0;i<objects.length;++i){
			Class actClass = objects[i].getClass();
			Method[] actMethods = actClass.getMethods();
			for(int e=0;e<actMethods.length;++e){
				System.out.println(i+"/"+e+" Name: "+actMethods[e].getName());
				System.out.println(i+"/"+e+" ReturnType: "+actMethods[e].getReturnType());
				System.out.println(i+"/"+e+" Parameters: "+Arrays.toString(actMethods[e].getParameterTypes()));
				System.out.println();
				
				if(actMethods[e].getName().contains("Info") && actMethods[e].getParameterTypes().length == 0){
					
					try {
						actMethods[e].invoke(objects[i]);
					} catch (IllegalArgumentException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					} catch (IllegalAccessException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					} catch (InvocationTargetException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
			}
		}
	}
}


class Bla{
	public void getInfo(){
		System.out.println("heyho ich bin getBla in Bla");
	}
	
	public void setBlubb(){
		System.out.println("blubb");
	}
	public void setInfo(int i){
		System.out.println("blubb mit i");
	}
}

class BlaBlubb{
	public int getBla(){
		System.out.println("ich bin getBla in BlaBlubb und returne Schinken");
		return 42;
	}
}
 

Wolfone

Mitglied
also danke auf jeden fall schonmal:


ich habe das jetzt erfolgreich mit hilfe deines codes gelöst. das ergebnis sieht wie folgt aus:


Java:
public class Selbsterkenntnis {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Object [] test = new Object[3];
        test[0] = new schnitzel();
        test[1] = new bauern();
        test[2] = new braubier();
        gebtSelbstauskunft(test);

	}


	
	public static void gebtSelbstauskunft (Object [] a){
		for (int i=0; i<=a.length-1; i++){
			Class class_i = a[i].getClass();
			Method[] methods = class_i.getMethods();
			for (int p=0; p<=methods.length-1; p++){
				
				if ((methods[p].getName().endsWith("Info"))&&(methods[p].getParameterTypes().length == 0)){
					try {
						methods[p].invoke(a[i]);
					}
					catch (IllegalAccessException e) {
						System.out.println(e);
					}
					catch (InvocationTargetException e) {
				    	System.out.println(e);	
					}
					catch (IllegalArgumentException e) {
						System.out.println(e);
					}
				}
			}
			
		}
	}

}


ABER...warum ist das so...ganz offensichtlich steckte ja da der fehler in den zeilen 23ff...ich verstehe nicht wo da der unterschied ist, bis auf dass ich ein paar variablen einspare von anfänglicher version zur jetztigen??? bzw. warum sind in version 1 von ganz oben nie die von mir programmierten methoden in schnitzel und braubier ausgegeben worden??? hätten die nicht dabei sein müssen neben notify notifyALL hashcode usw.???

ich mache doch bei den methoden dasselbe wie oben nur umständlicher???
(dass in version 2 die parameter nicht mehr in einem class-array gespeichert werden seh ich ja noch als halbwegs signifikante änderung ein, aber das mit den methodennamen versteh ich nicht...)
 
Zuletzt bearbeitet:
S

SlaterB

Gast
habe ich nicht deutlich genug beschrieben, dass
> Method[] methods = class_i.getMethods();
nur public Methoden liefert und deine Methoden nicht public sind und auch was du stattdessen machen sollst
(neben der Möglichkeit, die Methoden public zu machen)

wenn du was von den Ratschlägen nicht verstehst, kannst du ja nachfragen,
sie zu ignorieren ist weniger zielführend
 

Wolfone

Mitglied
hui!!!

entschuldigung!!!
stimmt!!

hab ich ja auch noch gemacht!!!

nur halt sehr spät erst dran gedacht...das hatte ich gegen ende mal eben schnell verbessert.

schon klar: eigene dummheit.

sollte keine respektlosigkeit gegenüber dir sein!

danke nochmal.
 

Schandro

Top Contributor
getMethods() gibt alle Methoden zurück, also auch die die in den Vaterklassen deklariert wurden. Dafür gibt es keine Methoden zurück, die nicht public sind.

In deiner Testklasse sind die Methoden alle nicht-public, in meiner sind sie alle public...

Wenn du getDeclaredMethods() benutzt, bekommst du alle Methoden (auch die die nicht public sind) UND auch nur die Methoden die in der Klasse deklariert wurden. (d.h. kein notifyAll usw. mehr..)

€dit: Und wieder mal war SlaterB schneller.
 

Wolfone

Mitglied
Danke nochmal euch beiden fürs mithelfen!!

Für alle die es interessieren sollte: ich habe die zweite Aufgabe ebenfalls gelöst. Dazu habe ich zwei Hilfsmethoden geschrieben, da ich keine Möglichkeit gefunden habe ordentlich was über superklassen zu erfahren.

Die eine Hilfsmethode zählt die Anzahl der superklassen einer klasse und wird von der zweiten Hilfsmethode verwendet, in der die superklassen einer klasse in einem klassen-array gespeichert werden und zwar in hierarchisch richtiger reihenfolge.

aufbauend auf dem ansatz von Slater funktioniert die Suche nach der speziellsten Oberklasse.

Ich stelle zunächst fest welche meiner zu untersuchenden klassen die geringere Anzahl superklassen hat. im worst case würde danach jedes element der kleineren klassenhierarchie mit jedem element der größeren klassenhierarchie verglichen, wobei mir gerade auffällt, dass da ja überhaupt keine unterscheidung notwendig wäre (ich idiot:oops: der code unten ist bereits optimiert)...da es ja netterweise in java keine "echte" mehrfachvererbung gibt liefert uns der test bei der ersten übereinstimmung bereits den gesuchten index.
man muss nur aufpassen den index für das richtige feld zu benutzen.
jetzt nur noch den namen der klasse im feld mit dem ermittelten index feststellen und fertig ist man.

ich habe natürlich ein kleines beispiel konstruiert

zur verdeutlichung: 5 testklassen klasse1,klasse2,...,klasse5

klasse5->klasse4->klasse3->klasse2
klasse1->klasse3

folglich erwarten wir die rpckgabe von klasse3 und das passiert auch^^

jetzt aber der code:
Java:
public class Selbsterkenntnis {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
 
		klasse1 test_1 = new klasse1();
		klasse5 test_2 = new klasse5();
		String ausgabe = gemeinsamerVorfahr(test_1,test_2);
		System.out.println(ausgabe);
	}


	

	public static int anzahlVorfahren(Class a){
       if (a.getSuperclass()!= null){
    	   return 1 + anzahlVorfahren(a.getSuperclass());
       }
       else {
    	   return 0;
       }
	}
	
	public static Class[] getSuperclasses(Class a){
		Class[] superclasses = new Class[anzahlVorfahren(a)];
		superclasses[0] = a.getSuperclass();
		for (int i = 1; i<=anzahlVorfahren(a)-1; i++){
		  superclasses[i] = superclasses[i-1].getSuperclass();	
		}
		return superclasses;
	}
	
	public static String gemeinsamerVorfahr(Object a, Object b){
		int vorfahren_a = anzahlVorfahren(a.getClass());
		int vorfahren_b = anzahlVorfahren(b.getClass());
        int indexcounter = 0;       
        boolean gefunden = false;
		Class class_a = a.getClass();
		Class class_b = b.getClass();
		Class[] classesOfa = getSuperclasses(class_a);
		Class[] classesOfb = getSuperclasses(class_b);
      

			for (int p = 0; p<= vorfahren_b-1; p++){
				for (int q = 0; q<= vorfahren_a-1; q++){
					if (classesOfb[p].equals(classesOfa[q])){
						indexcounter = p;
						gefunden = true;
						break;
					}
				}
				if(gefunden==true){
					break;
				}
			}
		String speziellste = classesOfb[indexcounter].getName();
		return speziellste;
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Problem bezüglich Key Listener Java Basics - Anfänger-Themen 3
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
A ScheduledExecutorService problem Java Basics - Anfänger-Themen 7
marcelnedza Problem mit Weltzuweisung, JavaKarol Java Basics - Anfänger-Themen 13
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
sserio BigInteger Problem Java Basics - Anfänger-Themen 4
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
K Problem mit "Random" Java Basics - Anfänger-Themen 5
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
xanxk Problem For-Schleife mit Charakter Java Basics - Anfänger-Themen 2
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Schleife Problem Java Basics - Anfänger-Themen 2
D Problem mit der Erkennung von \n Java Basics - Anfänger-Themen 2
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4
HeiTim Problem mit der Kommasetzung an der richtigen stelle Java Basics - Anfänger-Themen 59
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
P Problem mit Calendar.getDisplayName() Java Basics - Anfänger-Themen 8
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
M Problem mit Klassenverständnis und Button Java Basics - Anfänger-Themen 8
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
H Problem mit Verzweigungen Java Basics - Anfänger-Themen 6
H Problem mit Rückgabewert Java Basics - Anfänger-Themen 7
josfe1234 JAVA FX problem Java Basics - Anfänger-Themen 3
A Code Problem Java Basics - Anfänger-Themen 6
Henri Problem von Typen Java Basics - Anfänger-Themen 7
J Problem mit "ArrayIndexOutOfBoundsException" Java Basics - Anfänger-Themen 11
K jackson Mapping - Problem mit Zeitzonen Java Basics - Anfänger-Themen 10
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
D Schleifen Problem Java Basics - Anfänger-Themen 2
H So viele Fehlermeldungen, dass ich nicht weiß wo das Problem ist. Java Basics - Anfänger-Themen 6
J JAVA-Problem blockiert MEDIATHEKVIEW Java Basics - Anfänger-Themen 13
T Problem mit Lehrzeichen und String bei einfacher Chiffre Java Basics - Anfänger-Themen 8
J extends Problem Java Basics - Anfänger-Themen 2
C Polymorphie-Problem Java Basics - Anfänger-Themen 3
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
J Problem mit einer Methode die gewissen Inhalt einer Array löschen soll Java Basics - Anfänger-Themen 9
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
amgadalghabra algorithmisches Problem Java Basics - Anfänger-Themen 19
J Traveling Salesman Problem [Arrays] Java Basics - Anfänger-Themen 9
R ArrayList Problem Java Basics - Anfänger-Themen 6
InfinityDE Problem mit Datenübergabe an Konstruktor Java Basics - Anfänger-Themen 7
C RegEx Problem Java Basics - Anfänger-Themen 4
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
E Taschenrechner GUI Problem mit Fehlerhandling Java Basics - Anfänger-Themen 6
M Input/Output Fallunterscheidung Problem Java Basics - Anfänger-Themen 17
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
M Problem bei Ausgabe Java Basics - Anfänger-Themen 7
Splayfer Java Array Problem... Java Basics - Anfänger-Themen 2
G Problem bei der Ausgabe einer Main Claase Java Basics - Anfänger-Themen 7
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
G Subset sum problem mit Backtracking Java Basics - Anfänger-Themen 18
N Problem mit Scanner Java Basics - Anfänger-Themen 2
J Klassen Problem Java Basics - Anfänger-Themen 8
A Out.format problem. Java Basics - Anfänger-Themen 3
J Problem bei der Programmierung eines Tannenbaums Java Basics - Anfänger-Themen 9
A Array problem Java Basics - Anfänger-Themen 16
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
W Remote Method Invocation RMI - Problem Java Basics - Anfänger-Themen 0
I Ich habe ein Problem Java Basics - Anfänger-Themen 3
A Problem bei returnen eines Wertes Java Basics - Anfänger-Themen 6
M Regex Erstellung Problem Java Basics - Anfänger-Themen 2
D Input/Output Problem bei der Benutzereingabe eines Befehls Java Basics - Anfänger-Themen 14
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
F Habe ein problem mit dem ActionListener Java Basics - Anfänger-Themen 3
C Regex-Problem Java Basics - Anfänger-Themen 4
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
M Problem in der Modellierung Java Basics - Anfänger-Themen 20
W Wo ist das URL-Problem ? Java Basics - Anfänger-Themen 1
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
D FileWriter / FileReader Problem Java Basics - Anfänger-Themen 10
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
C Problem mit If Else If und Überprüfung eines Counters Java Basics - Anfänger-Themen 3
F Problem mit Listen Java Basics - Anfänger-Themen 5
I wieder mit einer Umwandelung habe ich Problem (diesmal von char Array zu char) Java Basics - Anfänger-Themen 1
J Problem bei Umrechnung von Hex in Bin Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben