Reflection Exception

Status
Nicht offen für weitere Antworten.

MQue

Top Contributor
Moin,

ich versuch mich gerade in Reflections, funkt aber leider nicht ganz,
ich habe die folgenden Klassen wobei die untere Klasse sich in einer jar befindet und in das Projekt mit der ersten Klasse eingebunden wurde.

Hat jemand einen Rat was ich da falsch mache?
Vielen Dank,


Code:
package antidecompiletest;

import java.lang.reflect.Method;

public final class AntiDecompileTest {

    public static void main(String ... args) throws Throwable {
        String bothWords = append("Hello ", "everybody.");
        System.out.println(bothWords);
        }

    public static String append(String firstWord, String secondWord) throws Exception {
        Class c = Class.forName("testprojekt.Main");
        Method concatMethod = c.getMethod("ausgabe", new Class[] {String.class});
        String result = (String) concatMethod.invoke(firstWord, new Object[] {secondWord});
        return result;
        }
}


Aufzurufende Methode ausgabe:
Code:
package testprojekt;

public class Main implements java.io.Serializable {

    public String ausgabe(String ausgabe) {
        return new String("Aus der Methode ausgabe: " + ausgabe);
        }
}

Exception:
Code:
Exception in thread "main" java.lang.IllegalArgumentException: object is not an instance of declaring class
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at antidecompiletest.AntiDecompileTest.append(AntiDecompileTest.java:15)
        at antidecompiletest.AntiDecompileTest.main(AntiDecompileTest.java:8)
 
Die invoke-Methode erwartet als ersten Parameter ein Objekt der Klasse, zu der die Methode gehört. Und das ist in deinem Fall testprojekt.Main. Du brauchst also erst ein Main-Objekt, um diese Methode aufrufen zu können.

Das hier
new String("Aus der Methode ausgabe: " + ausgabe)
ist übrigens immer schlecht. Schreibe statt dessen einfach
"Aus der Methode ausgabe: " + ausgabe
 
Im Klartext:
Java:
public static String append(String firstWord, String secondWord) throws Exception {
        Class<?> c = Class.forName("testprojekt.Main");
        Method concatMethod = c.getMethod("ausgabe", new Class[] {String.class});
        String result = (String) concatMethod.invoke(c.newInstance(), firstWord + secondWord);
        return result;
        }
 
funktioniert, vielen Dank,
eine Frage hätte ich noch und zwar wenn ich meine Methode so definiert habe:


Code:
public class Main implements java.io.Serializable {

    public void ausgabe(String ... ausgabe) {
        for (int i = 0; i < ausgabe.length; i++) {
            System.out.println(new Date(System.currentTimeMillis()) + "->" + ausgabe[i]);
            }
        }
}

was gebe ich dann hier als zweiten Parameter an:

Code:
Method concatMethod = c.getMethod("ausgabe", new Class[] {String.class});

PS: Reflection ist ja ziemlich mächtig, wo verwendet ihr Reflection, das was ich jetzt gemacht habe ist ja nahezu sinnlos, da ich gleich die Klasse importieren hätte können und dann die gewünschte Methode aufrufen,
Wäre sehr hilfreich, wenn ihr mir einige Anwendungsbeispiele geben könntet.
Vielen Dank,
 
Zuletzt bearbeitet:
Da da
Java:
Method concatMethod = c.getMethod("ausgabe", Array.newInstance(String.class, 0).getClass());
        String result = (String) concatMethod.invoke(c.newInstance(), new Object[]{new String[]{firstWord, secondWord}});
müsste gehen.
Ist aber etwas ungewöhnlich.

PS: Reflection ist ja ziemlich mächtig, wo verwendet ihr Reflection, das was ich jetzt gemacht habe ist ja nahezu sinnlos, da ich gleich die Klasse importieren hätte können und dann die gewünschte Methode aufrufen,
Wäre sehr hilfreich, wenn ihr mir einige Anwendungsbeispiele geben könntet.
Vielen Dank,

Ich habe mal ein kleines Framework gebaut, um Objekte auf andere abbilden zu können, die dann mittels JAXB in XML übersetzt werden.
Hab mich am Ende aber doch für Fabrikmethoden entschieden, da das ganze viel zu umfangreich wurde, als das noch ein anderer Entwickler den Durchblick gehabt hätte, wie man mit meinem Code umgehen muss.

Aber man kann schon tolle Sachen damit anstellen.

Edit: Anwendungsbeitspiele sind OR-Mapper und JAXB. Fast alles was sich heutzutage Framework schimpft verwendet Reflecion.
 
Zuletzt bearbeitet:
hab mich gerade noch mal informiert bzgl Reflections, mir ist das Untenstehende aber nicht klar,

void produce() f return new T(); // Compiler-Fehler -- wieso funktioniert das nicht?

Code:
Mit Typ-Parametern köonnen keine Objekte erzeugt werden:
class Factory<T> f ...
void produce() f return new T(); // Compiler-Fehler


Mit Reection kann das Problem gelöost werden:
static <T> T factory(Class<T> c, String param) f T result = c.newInstance();
...
return result;
gfactory(Person.class, "Andreas Lochbihler");
 
Wie würdet ihr das machen, wenn ihr ein Programm schreiben wolltet, bei dem man zur Laufzeit Verhalten hinzufügen möchte (nicht viel Verhalten 🙂),
würdet ihr da gleich das OSGi hernehmen (was ja meines wissens auch auf Reflection beruht) oder RCP machen oder macht es Sinn, sich eine kleine Appi selber zu schreiben, um den overflow der ganzen Frameworks nicht mitschleppen zu müssen (wobei dann wahrscheinlich eine Idee auf die andere folgt und man dann doch wieder ein Framework benötigt)

Gibts vielleicht ein Tutorial, wo man sich selber sowas bauen kann?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben