反射
主要说两点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或者做其他的事情,以后要改的话直接改配置文件,代码维护起来就很方便了