反射的基本概念
使用反射机制可以动态获取当前class的信息,比如方法的信息,注解信息,方法的参数,属性等。
反射技术应用的场景
(1)JDBC加载驱动连接Class.forName("");
(2)Spring容器框架IOC实例化对象。
(3)自定义注解生效(反射 +Aop)
(4)第三方核心的框架
反射技术的使用
Class类代表类的实体,在运行的java应用程序中表示类和接口。
Field类代表类的成员变量(成员变量也称为类的属性)
Method类 代表类的方法
Constructor类 代表类的构造方法
Class<?> class = Class.forName("类路径“)
我们来玩玩这个方法:
@Data
public class User {
private Integer age;
private String name;
public User(){
System.out.println("######=======我是无参构造函数===============#######");
}
public User(Integer age,String name){
System.out.println("######=======我是有参构造函数===============#######");
this.age = age;
this.name = name;
}
public String name(String name) {
System.out.println("name========######:"+name);
return "柳如是";
}
}
说这个之前我们来讲讲,初始化对象的方式:
第一种通过new的方式去初始化:
User user = new User();
第二种通过反射技术:
Class.forName("类的完整路径地址");
走无参构造函数初始化对象:
Class<?> aClass = Class.forName("com.zigao.com.entity.User");
//newInstance()初始化对象,实际上走的是无参构造函数初始化对象
User user = (User)aClass.newInstance();
System.out.println("user初始化对象########:"+user);
打印:
走有参构造函数初始化:
Class<?> aClass = Class.forName("com.zigao.com.entity.User");
Constructor<?> constructor = aClass.getConstructor(Integer.class, String.class);
User user = (User) constructor.newInstance(22, "懂小宛");
System.out.println("走有参构造函数初始化##############:"+user);
对私有对象属性赋值操作:
Class<?> aClass = Class.forName("com.zigao.com.entity.User");
User user = (User)aClass.newInstance();
//获取到私有对象属性
Field age = aClass.getDeclaredField("age");
age.set(user,22);
Field name = aClass.getDeclaredField("name");
name.set(user,"苏小小");
System.out.println(user);
执行上面这段代码,会报错:
因为我们是给私有的属性赋值,所以要开放权限,总结下:如果使用反射给私有属性或者调用私有的方做操作,都需要设置权限。
Class<?> aClass = Class.forName("com.zigao.com.entity.User");
User user = (User)aClass.newInstance();
//获取到私有对象属性
Field age = aClass.getDeclaredField("age");
age.setAccessible(true);
age.set(user,22);
Field name = aClass.getDeclaredField("name");
name.setAccessible(true);
name.set(user,"苏小小");
System.out.println(user);
打印:
使用反射机制调用方法:
Class<?> aClass = Class.forName("com.zigao.com.entity.User");
//参数一获是要调用的方法,参数二是方法参数类型
Method nameFuncaty = aClass.getDeclaredMethod("getName", String.class);
User user = (User) aClass.newInstance();
nameFuncaty.invoke(user,"柳如是");