[Java] 通过反射构造内部类对象 →→→→→进入此内容的聊天室

来自 , 2020-08-08, 写在 Java, 查看 108 次.
URL http://www.code666.cn/view/f91e24df
  1. import java.lang.reflect.Constructor;
  2. import java.lang.reflect.Method;
  3.  
  4. public class ReflectTest
  5. {
  6.      
  7.     public class Worker{
  8.         private String name = "";
  9.          
  10.         public void setName(String name){
  11.             this.name = name;
  12.         }
  13.          
  14.         public void work(){
  15.             System.out.println("worker "+name+" will work");
  16.         }
  17.     }
  18.      
  19.     public static class SWorker{
  20.         private String name = "";
  21.          
  22.         public void setName(String name){
  23.             this.name = name;
  24.         }
  25.          
  26.         public void work(){
  27.             System.out.println("s worker "+name+" will work");
  28.         }
  29.     }
  30.      
  31.     public static void main(String[] args)
  32.     {
  33.          
  34.         try{
  35.             /*
  36.             * 非静态内部类
  37.             */
  38.             ClassLoader loader = Thread.currentThread().getContextClassLoader();
  39.             //加载内部类名称的写法【包路径.主类名$内部类名】
  40.             Class clWorker = loader.loadClass("ReflectTest$Worker");
  41.              
  42.             //通过以下输出语句可以看到,内部类的构造函数需要外部类做参数
  43.             System.out.println("worker's cons is:"+clWorker.getDeclaredConstructors()[0]);
  44.             Constructor cons = clWorker.getDeclaredConstructor(ReflectTest.class);
  45.             Worker worker = (Worker)cons.newInstance(new ReflectTest());
  46.              
  47.             Method setMethod = clWorker.getMethod("setName",String.class);      
  48.             setMethod.invoke(worker,"张三");
  49.  
  50.             Method workMethod = clWorker.getMethod("work");
  51.             workMethod.invoke(worker);
  52.              
  53.             /*
  54.             * 静态内部类
  55.             */
  56.             Class clSWorker = loader.loadClass("ReflectTest$SWorker");
  57.              
  58.             //获取构造方法不需要加额外参数
  59.             Constructor cons1 = clSWorker.getDeclaredConstructor();
  60.             SWorker sWorker = (SWorker)cons1.newInstance();
  61.              
  62.             setMethod = clSWorker.getMethod("setName",String.class);
  63.             setMethod.invoke(sWorker,"李四");
  64.              
  65.             workMethod = clSWorker.getMethod("work");
  66.             workMethod.invoke(sWorker);
  67.              
  68.         }catch(Exception e){
  69.             e.printStackTrace();
  70.         }
  71.          
  72.     }
  73. }

回复 "通过反射构造内部类对象"

这儿你可以回复上面这条便签

captcha