Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
wir nehmen gerade reflections durch, die aufgabe ist folgende, man sollte irgend ein objekt einer Methode übergeben, dann sollte die Methode deren felder ausgeben und deren Methoden.
nun, weiss ich nicht so recht weiter, es gibt viel im netz, allerdings auch irgendwie nicht überschaubar..
könnte jemand mir unter die arme greifen?
danke^^
hallo
sorry, mein fehler, habe sogar jetzt das Problem gelöst.
eine frage bleibt:
für was braucht man das reflectionszeug? um ehrlich zu sein, schien mir- das mein leherer selber nicht so recht wusste, für welchen fall man das braucht.
folgend mein code:
Java:
private void getFields(Object o) throws ClassNotFoundException
{
String klassenName = o.getClass().getSimpleName();
Class myclass = Class.forName(klassenName);
Field[] field = myclass.getDeclaredFields();
for (int i = 0; i < field.length; i++)
{
System.out.println(field[i].getName());
}
Man braucht Reflections, um zum Beispiel Meta-Frameworks zu basteln. Wie zum Beispiel ein Checker Framework. Da ruft man zum Beispiel mit Reflections Annotationen ab.
Ich sehe den Vorteil noch nicht so recht, aber we will see.. vllt in den nächstenwochen..
andere frage:
ich möchte gerne die werte der membervariabeln ausgeben, allerdings bleibt meine Konsole leer:
Java:
private void getFields(Object o) throws ClassNotFoundException,
IllegalArgumentException, IllegalAccessException
{
String klassenName = o.getClass().getSimpleName();
Class myclass = Class.forName(klassenName);
Field[] field = myclass.getDeclaredFields();
for (int i = 0; i < field.length; i++)
{
String name = field[i].getName();
Object value = field[i].get(o);
System.out.printf("Variablen name: %s, Field value: %s%n", name, value);
}
andere frage:
wie kann ich in meinem Beispiel vergleichen ob es ein primitiver Datentyp ist oder nicht??
meine Idee ist, wenn das object, für wen ich die membervariabeln ausgebe, was ist wenn dieses object ein weiteres object hat usw???
dann möchte ich gerne den ganzen baum ausgeben..
public class Mensch
{
public String name = "name";
public int alter =16;
public String[] woerter =
{ "abc", "def" };
List<String> l = Arrays.asList(woerter);
}
wie man sieht, habe ich ein array in dieser klasse, später auch eine arraylist. meine vorstellung war diese, dass ich einfach den inhalt des arrays ausgebe bzw. der arraylist.
folgend nochmals die funktion, die für diese aufgabe zuständig ist.
Java:
private void getFields(Object o) throws ClassNotFoundException,
IllegalArgumentException, IllegalAccessException,
NoSuchFieldException, SecurityException
{
String klassenName = o.getClass().getSimpleName();
Class myclass = Class.forName(klassenName);
Field[] field = myclass.getDeclaredFields();
for (int i = 0; i < field.length; i++)
{
String name = field[i].getName();
Object value = field[i].get(o);
System.out.println("Variablen-werte =" + name + value);
if (!field[i].getClass().isPrimitive())
{
getFields(value) ;
}
}
}
etwas komisches ist passiert:
wenn ich im if-teil auf ein not überprüfe, gibt es eine exception, wenn ich das not weglasse,, wird mir die arraylist ausgegeben, für mich unverständlich, da das ja eigentlich passieren müsste, wenn ich ein not im if setze und wenn der fall eintritt.
ich hoffe ihr habt mich verstanden^^..
fall 1 ohne not im if print ausgabe:
Variablen-werte =namename
Variablen-werte =alter16
Variablen-werte =woerter[Ljava.lang.String;@19fc4e
Variablen-werte =l[abc, def]
das Array wird nicht geprintet.
fall 2 mit not im if:
Variablen-werte =namename
Exception in thread "main" java.lang.ClassNotFoundException: String
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
da wird der Name geprintet, allerdings alles andere nicht...
for (int i = 0; i < field.length; i++)
{
field[i].setAccessible(true);
String name = field[i].getName();
Object value = field[i].get(o);
if (field[i].getClass().isArray())
{
for (int j = 0; j < Array.getLength(field[j]); j++)
{
System.out.println("Variable und werte" + " " + field[j]);
}
} else
{
System.out.println("Variabeln und werte =" + " " + name + " "
+ " " + value);
}
}
ausgabe:
Variabeln und werte = name name
Variabeln und werte = alter 16
Variabeln und werte = woerter [Ljava.lang.String;@41675ec4
Variabeln und werte = l [abc, def]
das Array will es trotzdem nicht printen, ich wäre unheimlich dankbar, wenn sich jemand das anschauen könnte.
Ohne das jetzt genau geprüft zu haben, irritiert etwas, dass du manchmal
field
und manchmal
field[j]
hast. Ich glaube, da must du nochmal drüber nachdenken, was da nun was ist.
Die Schleife soll wohl eigentlich bis getLength(field[i]) gehen,
und ausgegeben werden sollte wohl field[j], oder?