如何运用反射将内部类映射出来

Class 类本身还提供对于获取内部类字节码的方法,分别为getClasses和getDeclaredClasses(),

其中getClasses()只能得 到访问级别为public的内部类,而getDeclaredClasses()则能得到所有声明了的内部类。

由 于内部类可以分为实例内部类,静态内部类,匿名内部类,前面提到的getClasses()和getDeclaredClasses()

目前还都只能得到 实例内部类和静态内部类,对于后面两种情况却无能为力,

为此还需要采取一些特殊的手段才能针对匿名内部类进行反射操作。  (如果哪位高手有更好的方式请在评论中不吝赐教)

                          package net.cn.blog;  

  1.   
  2. public class ReflectInnerClass {  
  3.   
  4.   
  5.       
  6.     public Runnable ta=new Runnable(){  
  7.         public void run(){  
  8.             System.out.println("匿名内部类中的方法被执行了");  
  9.         }  
  10.     };  
  11.   
  12.       
  13.     private class Inner2{  
  14.         public Inner2(){  
  15.             System.out.println("Inner2类被实例化了");  
  16.         }  
  17.     }  
  18.       
  19.     class Inner3{  
  20.         public Inner3(){  
  21.             System.out.println("Inner2类被实例化了");  
  22.         }  
  23.     }     
  24.     public class Inner1{  
  25.         public Inner1(){  
  26.             System.out.println("Inner1类被实例化了");  
  27.         }  
  28.     }  
  29. }  

                    下面对内部类进行反射

                           package net.cn.blog;  

  1.   
  2. import java.lang.reflect.InvocationTargetException;  
  3. import java.lang.reflect.Modifier;  
  4.   
  5. public class ReflectInnerClassTest {  
  6.   
  7.     public static void main(String args[]){  
  8.         ReflectInnerClass ric=new ReflectInnerClass();  
  9.         try {  
  10.             reflectInnerClass(ric);  
  11.         } catch (Exception e) {  
  12.             e.printStackTrace();  
  13.         }   
  14.     }  
  15.   
  16.     private static void reflectInnerClass(ReflectInnerClass ric) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException, NoSuchFieldException {  
  17.         Class clazz=ric.getClass();  
  18.         Class classes[]=clazz.getDeclaredClasses();  
  19.         for(Class c:classes){//对成员内部类进行反射  
  20.             int i=c.getModifiers();  
  21.             String s=Modifier.toString(i);  
  22.             if(s.contains("static"))//静态内部类的处理  
  23.                  c.getConstructor().newInstance();  
  24.             else//实例内部类的处理  
  25.                  c.getConstructor(ric.getClass()).newInstance(ric);  
  26.         }  
  27.         //由于匿名内部类没有构建器,因此无法创建实例,也无法直接访问其中的方法,但可以通过下面的方式巧秒的执行其中的方法或成员变量。  
  28.         Runnable r=(Runnable)(clazz.getField("ta").get(ric));  
  29.         r.run();  
  30.           
  31.     }  
  32. }  
 
 
 
 
posted @ 2015-09-15 15:22  牛肉羊杂汤  阅读(1309)  评论(0编辑  收藏  举报