# Reflection + abbruch ohne informationen



## lumo (11. Aug 2010)

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)


```
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?


----------



## Gast2 (11. Aug 2010)

```
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 (11. Aug 2010)

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 

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?!)


----------



## SlaterB (11. Aug 2010)

> 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 (11. Aug 2010)

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...)


----------



## SlaterB (11. Aug 2010)

```
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 (11. Aug 2010)

nope

```
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!


----------

