反射

主要说两点1.什么是反射2.反射的应用场景
1:什么是反射
在类加载到内存中的时候,要将编译后的.class文件读入内存,并由Class类为之创建Class对象
在内存中一个类只有一个Class对象产生
所谓反射就是可以通过类获取该类的所有属性和方法
类加载的过程:
当我们new Stu()时候,jvm会加载我们的stu.class
jvm会去本地磁盘上找到stu.class文件,并加载到jvm内存中
这时jvm会自动创建一个Class对象,并且一个类只会创建一个
反射就是通过这个Class对象反向获取这个类的各种信息
获取Class对象的三种方式:

 1 public class Demo1_Reflect {
 2     public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException {
 3         //第一种
 4         Class clazz1 = Class.forName("cn.alibaba.spq.Person");
 5         //第二种
 6         Person per = new Person();  
 7         Class perClass = per.getClass();
 8         //第三种
 9         Class persClass = Person.class; 
10     }
11 }


在Class类的api中可以查看到各种方法:
常用如下:

 1 public class Demo1_Reflect {
 2     public static void main(String[] args) throws Exception {
 3         //第一种
 4         Class clazz1 = Class.forName("cn.alibaba.spq.Person");
 5         //获取构造方法
 6         Constructor[] arrcon = clazz1.getDeclaredConstructors();
 7         for (Constructor c : arrcon) {
 8             System.out.println(c);
 9         }
10         //获取属性
11         System.out.println("---------");
12         Field[] fields = clazz1.getDeclaredFields(); 
13         for (Field field : fields) {
14             System.out.println(field);
15         }
16         //获取方法
17         System.out.println("---------");
18         Method[] merArr = clazz1.getDeclaredMethods();
19         for (Method method : merArr) {
20             System.out.println(method);
21         }
22     }
23 }

2.反射的应用场景

在获取Class对象上常用第一种方式,因为只需要传入String,这样我们就可以把String写在配置文件中,然后采用获取配置文件的方式进行加载,如下:

1 BufferedReader br = new BufferedReader(newFileReader("xxx.properties"));    //创建输入流关联xxx.properties
2 Class clazz = Class.forName(br.readLine());                                    //读取配置文件中类名,获取字节码对象

其实这种方式在Spring中用到最多,经典的就是在xml文件或者properties里面写好了配置,然后在Java类里面解析xml或properties里面的内容,得到一个字符串,然后用反射机制,根据这个字符串获得某个类的Class实例,这样就可以动态配置一些东西,不用每一次都要在代码里面去new或者做其他的事情,以后要改的话直接改配置文件,代码维护起来就很方便了

原文地址:https://www.cnblogs.com/jaro/p/8975088.html