Java反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

已知HelloWorld类

 1 package cn.test.HelloWorld;
 2  
 3 public class HelloWorld {
 4     public HelloWorld()
 5     {}
 6     public HelloWorld(String s,Integer i)
 7     {
 8         System.out.println("构造函数(有参数)"+s+i);
 9     }
10      
11     private HelloWorld(String s)
12     {
13         System.out.println("私有构造函数(有参数)"+s);
14     }
15      
16     public String name="Jack";
17     private Integer age=23;
18      
19     public void print()
20     {
21         System.out.println("*******输出函数");
22     }
23     public void print(String s,Integer i)
24     {
25         System.out.println("******输出函数(有参数)"+s+i);
26     }
27      
28     private void print(String s)
29     {
30         System.out.println("*****私有输出函数(有参数)"+s);
31     }
32  
33 }

1、反射获得class

    有三种方法获得字节码:

//获得字节码
        //1、最常用
        Class clazz=Class.forName("cn.test.HelloWorld.HelloWorld");
        System.out.println(clazz);
         
        //2、已知类
        Class clazz2=HelloWorld.class;
        System.out.println(clazz2);
         
        //3、已知对象
        HelloWorld helloWorld=new HelloWorld();
        Class clazz3=helloWorld.getClass();
        System.out.println(clazz3);

2、反射获得构造函数

1 //获得默认构造
2         Constructor constructor=clazz.getConstructor();
3         //执行
4         Object object= constructor.newInstance();
5          
6         //获得有参数的构造函数
7         constructor=clazz.getConstructor(String.class,Integer.class);
8         //执行
9         constructor.newInstance("abcd",1234);

3、反射获得字段

 1 //快捷方式:获得默认构造函数
 2         Object obj=clazz.newInstance();    
 3         //获得字段
 4         Field field=clazz.getField("name");
 5         //关联
 6         Object value = field.get(obj);
 7         //输出
 8         System.out.println(value);
 9          
10         //设置值name
11         field.set(obj, "jack2");
12         value=field.get(obj);
13         System.out.println(value);
14          
15         //获得私有字段
16         field=clazz.getDeclaredField("age");
17         field.setAccessible(true);
18         value=field.get(obj);
19         System.out.println(value);
20          
21         //设置age
22         field.set(obj, 25);
23         value=field.get(obj);
24         System.out.println(value);

4、反射获得函数

 1 //实例化
 2         Object obj1=clazz.newInstance();
 3         //获取函数
 4         Method method=clazz.getMethod("print");
 5         //执行
 6         method.invoke(obj1);
 7          
 8         //获取有参函数
 9         method=clazz.getMethod("print", String.class,Integer.class);
10         //执行
11         method.invoke(obj1, "dsf",123456);
12          
13         //获取私有函数
14         method=clazz.getDeclaredMethod("print",String.class);
15         method.setAccessible(true);
16         method.invoke(obj1, "qwertyui");

原文地址:https://www.cnblogs.com/liuwt365/p/4079431.html