2016-08-15 1 views
-4

ich die folgende Klasse haben:Reflexion erhalten Bereich der Singleton statischen geschachtelten Klasse

public class A { 
    private static class B { 
     private static final B instance = new B(); 
     private ArrayMap<String, Integer> map; 
    } 
} 

Ich bin mit Reflexion versucht, die Karte Feld zu erhalten, aber ich verstehe nicht was zu tun ist. Mein aktueller Code ist:

Class<?>[] classes = ainstance.getClass().getDeclaredClasses(); 
    for (Class c : classes) { 
     if (c.getName().equals("com.foo.A$B")) { 
      try { 
       Field f = c.getDeclaredField("instance"); 
       f.setAccessible(true); 
       Field f1 = c.getDeclaredField("map"); 
       f1.setAccessible(true); 
       ArrayMap<String, Integer> map; 
       try { 
        map = (ArrayMap<String, Integer>) f1.get(f.getType()); 
        System.out.println(map.get("id")); 
       } catch (IllegalAccessException e) { 
        e.printStackTrace(); 
       } 
      } catch (NoSuchFieldException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
+1

Und was funktioniert nicht? Sie sollten lange genug dabei sein, um zu verstehen, wie man "Code nicht funktioniert" -Fragen schreibt. – GhostCat

+2

'f1.get (f.getType())' -> 'f1.get (f.get (null))', vielleicht? Ohne einen Stacktrace ist es schwer zu wissen, was schief läuft. –

+0

'f.getType()' macht nicht viel Sinn. Es sollte "f.getValue (null)" sein. "Static inner" ist ein Widerspruch in sich. – EJP

Antwort

1

Nach

  Field f = c.getDeclaredField("instance"); 
      f.setAccessible(true); 

braucht man das instance Objekt zu erhalten:

  Object instance = f.get(null); // null as static, no 'this'. 

Dann dieselbe für Karte, jetzt nicht mit null, aber instance.

   map = (ArrayMap<String, Integer>) f1.get(instance); 

Man könnte die generischen Typparameter fallen lassen.

+0

Vielen Dank, es hat funktioniert. – greywolf82

Verwandte Themen