Java Reflections

Diskutiere Java Reflections im Allgemeine Java-Themen Bereich.
G

Gansa

Hallo, ich habe ein Programm mit 3 Klassen (Address, City, Student) geschrieben, mit nur gettern&settern. Jetzt möchte ich in meiner Main Methode den jeweiligen Klassennamen mit den Methoden und die aktuelle Ausprägung des Objekts ausgeben. Das klappt nur halb, ich bekomme ständig den selben Fehler und sitze schon etwas länger dran. Der Fehler lautet : "Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments". Ich bekomme nur einen Teil der Ausgabe. Es ist so das z.b die Klasse Student eine Referenzvariable auf Address hat und Address eine Referenzvariable auf City. D.h in meiner main rufe ich die Methode nur mit dem Objekt Student auf: Pint(s). Es soll in der Methode auf weitere Objekte geprüft werden, und falls es welche gibt, dann wieder mit invoke deren Inhalt ausgeben. Ich kopiere meinen Code rein, also nur die Application. Falls die anderen Klassen nötig sind, kann ich die auch im Nachhinein rein kopieren, aber wie gesagt da sind nur getter&setter drin. Falls jemand mir bei meinem Problem helfen kann, würde ich mich sehr freuen.

Java:
public class Main {

    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {

        City c = new City();
        c.setName("Wiesbaden");
        c.setState("Hessen");
        c.setZipCode("65197");


        Address a = new Address();
        a.setCity(c);
        a.setHouseNumber(23);
        a.setStreet("Wernerstr");

        Student s = new Student();
        s.setName("Florian");
        s.setAddress(a);


        print(s);
    }

    public static void print(Object un) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {


        Class clazz = un.getClass();
        System.out.println(clazz.getSimpleName());

        Method[] m = clazz.getDeclaredMethods();

        for (int i = 0; i < m.length; i++) {
            if (m[i].getName().contains("get")) {
                System.out.println("\n" + m[i].getName().replace("get", "") + ": ");
                //  System.out.println("\t"+">"+m[i].invoke(un));
                if (m[i].getReturnType().isAssignableFrom(String.class)
                        || (m[i].getReturnType().isPrimitive())) {
                    System.out.println("\t" + ">" + m[i].invoke(un));

                }

                if (!m[i].getReturnType().isAssignableFrom(String.class)
                        && !(m[i].getReturnType().isPrimitive())) {
                    print(m[i].invoke(un));
                }
            }


        }

    }
}
 
L

LimDul

Zeigt mal die Klassen (vor allem Student). Und was wird vor der Exception ausgegbeen, also bei welchem Attribut legt er sich lang?
 
G

Gansa

Zeigt mal die Klassen (vor allem Student). Und was wird vor der Exception ausgegbeen, also bei welchem Attribut legt er sich lang?
Das ist die Klasse student und die Ausgabe von meinem Code ist:

Student

Name:
>Florian

Address:
Address

City:
City

Name:
>Wiesbaden

State:
>Hessen

ZipCode:
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at Test.Main.print(Main.java:43)
at Test.Main.print(Main.java:49)
at Test.Main.print(Main.java:49)
at Test.Main.main(Main.java:26)

Java:
public class Student {

    private String name;
    private Address address;
/*
    public Student(String name, Address address) {
        this.name = name;
        this.address = address;
    }

 */

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}
 
L

LimDul

Nachtrag - du rufst deine print Methode für jede getMethode auf - das geht schief, weil du sie unter anderem auch für getClass aufrufst - also mit einem Class-Objekt. Was damit auch in einer Endlosschliefe resultiert, den das hat auch wieder eine getClass Methode. Mindestens die musst du ausfiltern.
 
J

JustNobody

Von welchem Typ ist den ZipCode? Da scheint es ja Probleme zu geben.

Generell scheint die Exception ja zu besagen, dass die Anzahl der Argumente nicht korrekt ist. Ehe Du also ein invoke aufrufst, solltest Du prüfen, ob die Anzahl der Parameter korrekt ist. Da scheint eine get Methode zu sein, die einen Parameter verlangt.

Du könntest also noch getParameterCount() abfragen um dann auf den Aufruf zu verzichten.
 
G

Gansa

Von welchem Typ ist den ZipCode? Da scheint es ja Probleme zu geben.

Generell scheint die Exception ja zu besagen, dass die Anzahl der Argumente nicht korrekt ist. Ehe Du also ein invoke aufrufst, solltest Du prüfen, ob die Anzahl der Parameter korrekt ist. Da scheint eine get Methode zu sein, die einen Parameter verlangt.

Du könntest also noch getParameterCount() abfragen um dann auf den Aufruf zu verzichten.
Ohhhh Danke! das hat jetzt funktioniert! Da hat die getMethode in City für zipCode wirklich einen Parameter erwartet.. vielen Dank!!!
 
L

LimDul

Nachtrag - du rufst deine print Methode für jede getMethode auf - das geht schief, weil du sie unter anderem auch für getClass aufrufst - also mit einem Class-Objekt. Was damit auch in einer Endlosschliefe resultiert, den das hat auch wieder eine getClass Methode. Mindestens die musst du ausfiltern.
Ich hab da Unfug erzählt - du holst dir ja nur die DeclaredMethods - vergiss also diesen Kommentar :)
 
Thema: 

Java Reflections

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben