bubble: Reflection, Security-Manager, AccessControlException

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
  1. Wenn ich via java mytest.Test starte bekomm ich wie erwartet

    id

    name
    123
    abc

    Das 123 und abc einfach mal ignorieren, hab ich nur beim überflüssigen Zeug entfernen übersehen.  
      
    MfG  
    bubble
    
    -- 
    If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
    
  2. Hallo,
    Kenne mich leider mit dem SecurityManager null aus, aber vielleicht hilft da die

    Dokumentation zur setAccessible-Methode weiter:

    "...A SecurityException is raised if flag is true but accessibility of this object may not be changed (for example, if this element object is a Constructor object for the class Class).

    A SecurityException is raised if this object is a Constructor object for the class java.lang.Class, and flag is true. ..."

    Leider kann ich Dir nicht sagen ob einer der o.g. Fälle bei Dir gegeben ist, aber vielleicht ist das ja ein Hinweis.

    Viele Grüße,
    Jörg

    1. Dokumentation zur setAccessible-Methode weiter:

      "...A SecurityException is raised if flag is true but accessibility of this object may not be changed (for example, if this element object is a Constructor object for the class Class).

      A SecurityException is raised if this object is a Constructor object for the class java.lang.Class, and flag is true. ..."

      	if(!f.isAccessible()) {  
      		f.setAccessible(true); // Hier wird die Exception geworfen  
      	}
      

      Dadurch, dass ich ja nur falls es noch nicht auf true gesetzt ist, auf true setzen will, schließt das die beiden Ursachen die du gepostet hast nach meinem Verständnis eigentlich aus.

      Hab allerdings auch selbst zum ersten mal mit dem Security-Manager zu tun.

      MfG
      bubble

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