網上的資料對於如何運用反射將內部類映射出來的資料很是之少,爲此我特地花了一個多小時研究了一下子,下面把研究的結果寫到下面。java
Class類自己還提供對於獲取內部類字節碼的方法,分別爲getClasses和getDeclaredClasses(),其中getClasses()只能獲得訪問級別爲public的內部類,而getDeclaredClasses()則能獲得全部聲明瞭的內部類。code
因爲內部類能夠分爲實例內部類,靜態內部類,匿名內部類,前面提到的getClasses()和getDeclaredClasses()目前還都只能獲得實例內部類和靜態內部類,對於後面兩種狀況卻無能爲力,爲此還須要採起一些特殊的手段才能針對匿名內部類進行反射操做。get
public class ReflectInnerClass { public Runnable ta = new Runnable() { public void run() { System.out.println("匿名內部類中的方法被執行了"); } }; private class Inner2 { public Inner2() { System.out.println("Inner2類被實例化了"); } } class Inner3 { public Inner3() { System.out.println("Inner3類被實例化了"); } } public class Inner1 { public Inner1() { System.out.println("Inner1類被實例化了"); } } }
下面對內部類進行反射io
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Modifier; public class ReflectInnerClassTest { public static void main(String args[]) { ReflectInnerClass ric = new ReflectInnerClass(); try { reflectInnerClass(ric); } catch (Exception e) { e.printStackTrace(); } } private static void reflectInnerClass(ReflectInnerClass ric) throws Exception { Class clazz = ric.getClass(); Class classes[] = clazz.getDeclaredClasses(); for (Class c : classes) {//對成員內部類進行反射 int i = c.getModifiers(); String s = Modifier.toString(i); if (s.contains("static"))//靜態內部類的處理 c.getConstructor().newInstance(); else//實例內部類的處理 c.getConstructor(ric.getClass()).newInstance(ric); } //因爲匿名內部類沒有構建器,所以沒法建立實例,也沒法直接訪問其中的方法,但能夠經過下面的方式巧秒的執行其中的方法或成員變量。 Runnable r = (Runnable) (clazz.getField("ta").get(ric)); r.run(); } }