bubble: Reflection, Security-Manager, AccessControlException

Beitrag lesen

Hi,

via Reflection und Annotationen wollt ich mir ein kleines System zum Laden und Speichern von Objekten basteln, leider macht mir der Security-Manager da einen Strich durch die Rechnung.

Exception in thread "main" java.security.AccessControlException: access denied (  
"java.lang.reflect.ReflectPermission" "suppressAccessChecks")

Hier der relevante Code der die Reflection betrifft:
[code=java]package mytest.data;

public final class Data {
private static class InfoCatch implements PrivilegedAction<FieldInfo[]> {
private Class<?> cl;
private InfoCatch(Class<?> cl) {
this.cl = cl;
}
@Override
public FieldInfo[] run() {
Vector<FieldInfo> fields = new Vector<FieldInfo>();
DataFieldInfo an;
for(Field f: cl.getDeclaredFields())
if ((an = f.getAnnotation(DataFieldInfo.class)) != null){
if(!f.isAccessible()) {
f.setAccessible(true); // Hier wird die Exception geworfen
}
fields.add(new FieldInfo(f, an));
}
return fields.toArray(new FieldInfo[fields.size()]);
}
}
public static FieldInfo[] getTableInfo(Class<?> cl) {
/* ... */
return AccessController.doPrivileged(new InfoCatch(cl));
}
}
[/code]

Und hier mal der Code um zu testen:
[code=java]package mytest;

public class TestData {
@DataFieldInfo
private int id;
@DataFieldInfo
private String name;

public TestData(int id, String name) {  
	this.id = id;  
	this.name = name;  
}  

}
[/code]

[code=java]package mytest;

public class Test {
public static void main(String[] args) {
TestData d = new TestData(123, "abc");
FieldInfo[] fi = Data.getTableInfo(d.getClass());
for(FieldInfo f: fi) {
System.out.println(f.getField().getName());
}
}
}
[/code]

Wenn ich via java mytest.Test starte bekomm ich wie erwartet

id  
name  
123  
abc

Wenn ich allerdings via java -Djava.security.manager mytest.Test starte, wird oben genannte AccessControlException geworfen.

Zu erst hatte ich den Code ohne den Umweg über AccessController.doPrivileged() bin dann aber auf die Exception gestoßen und nach einer ausgiebigen Google-Sitzung halt auf AccessController.doPrivileged()

Wo liegt mein Fehler?

MfG
bubble

--
If "god" had intended us to drink beer, he would have given us stomachs. - David Daye