java反射——對內部類的處理
阿新 • • 發佈:2018-12-26
Class類本身還提供對於獲取內部類位元組碼的方法,分別為getClasses和getDeclaredClasses(),其中getClasses()只能得到訪問級別為public的內部類,而getDeclaredClasses()則能得到所有聲明瞭的內部類。
由於內部類可以分為例項內部類,靜態內部類,匿名內部類,前面提到的getClasses()和getDeclaredClasses()目前還都只能得到例項內部類和靜態內部類,對於後面兩種情況卻無能為力,為此還需要採取一些特殊的手段才能針對匿名內部類進行反射操作
package net.csdn.blog; 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("Inner2類被例項化了"); } } public class Inner1{ public Inner1(){ System.out.println("Inner1類被例項化了"); } } }
***對內部類反射**
package net.csdn.blog; 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 InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException, NoSuchFieldException { 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(); } }