反射:通过JVM运行中的class文件,获取相应对象的方法和属性的机制。
1、Class类三种生成方式:
1.1、Class clz1=Object.class
1.2、Class clz2=Object.getClass()
1.3、Class clz3=Class.forName(类全文件名) // 常用在配置文件中
2、获取对象实例:
创建对象:package com.xyf.model;
public class User {
private String name;
public int age;
public User() {}
public void User(String str){}
public void test(String str){}
private void test2(String str){}
}
Class clz = Class.forName("com.xyf.model.User");
Object obj = clz.newInstance();
3、通过反射构造器获取对象
Class clz = Class.forName("com.xyf.model.User");
调用无参构造器:Constructor con = clz.getConstructor(); Object obj = con.newInstance();
调用有参构造器:Constructor con = clz.getConstructor(String.class); Object obj = con.newInstance(参数);
创建对象:Object obj = con.newInstance();
4、通过反射获取方法
4.1.获取公共方法
Class clz = Class.forName("com.xyf.model.User");
Method method = clz.getMethod(“test”, 参数类型-class);
method.invoke(con.newInstance(), 参数);
4.2.获取私有方法
Class clz = Class.forName("com.xyf.model.User");//获取class文件
Method method = clz.getDeclaredMethod("test2", String.class);//获取私有方法test2
method.setAccessible(true);
method.invoke(con.newInstance(), 参数);//执行方法
5、通过反射获取属性
Class clz = Class.forName("com.xyf.model.User");
5.1.获取公共属性
Field field = clz.getField("name");
User user = (User) clz.newInstance();// 给属性赋值
field.set(user, "demo");// 给属性赋值
String name = field.get(user);// 取值
5.2.获取私有属性
Field field = clz.getDeclaredField("age");
User user = (User) clz.newInstance();
field.setAccessible(true);
field.set(user, 20);// 给属性赋值
int age = field.get(user);// 取值