Reflection + abbruch ohne informationen

lumo

Top Contributor
Hallo

es scheint nicht meine woche zu sein.
gestern hab ich code geschrieben, der auch funktionierte.
heute beim einschalten des rechners funktioniert nichts mehr.

habe eine funktion implementiert, die mir alle set-funktionen mit standardwerten füllt (somit fülle ich ein von mir erstelltes objekt mit standardwerten sozusagen ein dummy-objekt)

Java:
static void invokeAll(Object obj) {
		System.out.println("invokeAll started.");
		Class<?>[] classes = { String.class, Integer.class, Double.class,
				Boolean.class, Set.class, Calendar.class };
		Object[] values = { "String", Integer.valueOf(0), Double.valueOf(0.0),
				Boolean.valueOf(false), new HashSet<String>(),
				Calendar.getInstance().clone() };
		// TODO: nullvalues weg, realvalues verwenden.
		Map<Class<?>, Object> nullValues = new HashMap<Class<?>, Object>();
		Map<Class<?>, Object> realValues = new HashMap<Class<?>, Object>();
		for (int i = 0; i < classes.length; i++) {
			nullValues.put(classes[i], null);
			realValues.put(classes[i], values[i]);
		} // end TODO

		// get all possible (set) functions
		System.out.println("incovkeAll on obj " + obj.getClass().getName()); //(1)
		Method[] methods = obj.getClass().getMethods();
		System.out.println(methods.length); //(2)
		for (int i = 0; i < methods.length; i++) {
			Method m = methods[i];
			if (m.getName().startsWith("set")) {
				Class<?>[] argTypes = m.getParameterTypes();
				if (argTypes.length == 1) {
					try {
						m.invoke(obj, nullValues.get(argTypes[0])); // change to realValues
					} catch (IllegalArgumentException e) {
						e.printStackTrace();
					} catch (IllegalAccessException e) {
						e.printStackTrace();
					} catch (InvocationTargetException e) {
						e.printStackTrace();
					}
					if (DEBUG) {
						System.out.println(String.format(
								"function %s(args[%d]) set", m.getName(),
								argTypes.length));
					}
				} else {
					if (DEBUG) {
						System.err.println(String.format(
								"function %s(args[%d]) skipped", m.getName(),
								argTypes.length));
					}
				}
			}
		}
		System.out.println("invokeAll finished.");
	}
die ausführung endet zwischen (1) und (2) ich habe auch schon versucht das mit einem try / catch block abzufangen, allerdings kommt auch dann keine ausgabe/exception!

irgendwelche ideen?
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Java:
Method[] methods = obj.getClass().getMethods();
// ->
Class c = obj.getClass();
Method[] methods = c.getMethods();

und debug das mal Schrittweise und schau was der Debugger dazu sagt
 

lumo

Top Contributor
hab den debugger bis jetzt noch nie gebraucht...
wie überwache ich dort eine variable.
breakpoints setzten kann ich, nur bleibt er bei denen nicht mal stehen :oops:

edit: wenn ich die klasse ausgeben lasse kommt die richtige...
edit2: hab jetzt ein kleines testprogramm ausserhalb meiner plugin-struktur angelegt.
wenn ich hier das invokeall aufrufe klappts... (WTF?!)
 
Zuletzt bearbeitet:
S

SlaterB

Gast
> die ausführung endet zwischen (1) und (2)

was heißt das denn genau, beendet sich das Programm/ der einzelne Thread (hängt er nicht vielleicht?),
weißt du welche Codezeile als nächstes dran kommt?

den testweisen try / catch block machst du mit Throwable oder Exception?
 

lumo

Top Contributor
das heisst...
ich habe einen button der die funktion aufruft.
wenn ich den button anklicke dann kommt er genau bis zeile (1)
der rest wird gefressen.
drücke ich den button noch einmal, passiert das selbe wieder.
den try-block mache ich mit Exception da eine SecuirtyException geworfen werden sollte, falls was schiefgeht, was aber nicht gemacht wird...

weißt du welche Codezeile als nächstes dran kommt?
keine, in der funktion - er steigt einfach aus (als ob ich in der funktion ein return/break hätte... das programm läuft danach normal weiter...)
 
S

SlaterB

Gast
Java:
System.out.println("vor");
try {
   invokeAll()
}catch(Throwable t) {
   System.out.println("t gefangen");
} finally {
   System.out.println("ich auch noch");
}
System.out.println("nach");
bringt nur die 'vor'-Ausgabe?
 

lumo

Top Contributor
nope
Code:
vor
t gefangen
ich auch noch
nach

public Method[] getMethods() throws SecurityException
warum steht die info dort nicht?

@throwable: java.lang.NoClassDefFoundError
hätte ich die info gleich gehabt... jetzt weiss ich was falsch ist...

DANKE!
 

Ähnliche Java Themen

Neue Themen


Oben