Java基础学习
Java基础学习之反射
反射是java中非常重要的知识点,无论是Bean
的初始化还是获取标注的注解
也可以用到反射,在日常开发中不会直接使用反射,但是我们在开发项目的时候基本每刻都在使用反射。
本文中会先介绍反射的思想、基本使用、以及优缺点。
正射
在了解反射前,可以先理解一下什么是正射,有光的地方就有黑暗,有反射就会有正射,在java中没有用到反射相关类的时候就是正射,用的最多的就是采用采用new
的方式去实例化对象,在对实例化对象进行操作,例如:map
Map<Integer,Integer> map = new HashMap<>();
map.put(1,1);
如果HashMap
不能满足需求时,需要将HashMap
更换为LinkedHashMap
存储,需要重新修改代码进行编译:
Map<Integer,Integer> map = new LinkedHashMap<>();
map.put(1,2);
每次需求的改变都需要进行一次代码的修改、编译、打包、重启是非常耗时的操作。如果采用一个开关传参来决定什么时候来决定使用哪一种数据结构。
public Map<Integer, Integer> getMap(String param) {
Map<Integer, Integer> map = null;
if (param.equals("HashMap")) {
map = new HashMap<>();
} else if (param.equals("LinkedHashMap")) {
map = new LinkedHashMap<>();
}
return map;
}
通过传参的方式来决定使用哪一种数据结构,可以在项目运行时动态传参来决定,如果需要的Map
不存在就需要改变源码,重新编译,这个时候就需要反射来提升效率,如果在代码执行的时候不知道
要使用哪一种数据结构,只有程序运行的时候才决定使用哪一种数据结构。
反射的思想
反射
可以在程序运行过程中动态获取类信息和调用类方法,通过反射构造类实例。
官方文档的解释:Java的反射机制是指对于任意一个类都能够知道这个类的所有属性和方法,并且对于任意一个对象都能够调用他的任意一个方法,动态调用获取信息以及动态调用获取对象的方法就是Java的反射机制。
对于上面的获取Map
的方法可以采用反射去实现,代码如下:
public Map<Integer,Integer> getMap(String className){
Class clazz = Class.forName(className);
Constructor con = clazz.getConstructor();
return (Map<Integer,Integer>) con.newInstance();
}
通过传入全类名路径
到方法中,获取对应的Map实例,例如:java.util.HashMap
/java.util.LinkedHashMap
,不需要修改上述源码。
采用这种方式可以不需要修改源码,就可以在运行时可以确定使用哪种数据结构,在切换类时无需修改源码或者重新编译程序。
反射的基本使用
Java反射的主要组成部分有四个:
-
Class: 任何运行在内存中的所有类都是该Class类的实例对象,每个Class类对象内部都包含了本来的所有信息,通过反射去做任何事情首先找到Class不会有错;
-
Field:描述一个类的属性,内部包含了属性的所有信息,例如数据类型,属性名,访问修饰符
-
Constructor:描述一个类的构造方法,内部包含了构造方法的所有信息,例如参数类型,参数名字,访问修饰符…
-
Method:描述一个类的所有方法(包含抽象方法),内部包含了该方法的所有信息,与
Constructor
类似,不同之处在于Method拥有返回值类型信息,因为构造方法是没有返回值的。
在学习反射的时候,以UserInfo
位模板进行说明,该类的基本组成如下:属性,构造函数和方法
public class UserInfo {
public String name;
public Integer age;
private double weight; // 体重只有自己能知道
public UserInfo(){
}
public UserInfo(String name,Integer age){
this.name