在程序运行时,我们需要获取类的一些信息 我们就可以用到反射来获取
1.准备工作
首先需要一个类和一个注解 ,注解是在这个类上面的
/**
* 用于练习反射的类
*
* @author dongzhiwei
* @date 2020/9/21 16:55
*/
@MyAnno(id = 12,userCode = "AB123")
public class ReflectBean {
/**
* 名称
*/
private String name;
/**
* 身份证
*/
public String idCode;
/**
* 名称
*/
private String name;
/**
* 身份证
*/
public String idCode;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIdCode() {
return idCode;
}
public void setIdCode(String idCode) {
this.idCode = idCode;
}
public int invokeTest(String userCode, Integer age) {
int total = 10;
total = total + age;
System.out.println("用户code:"+userCode+"总数为:"+total);
return total;
}
}
/**
* @author dongzhiwei
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {
int id();
String userCode();
}
2. 通过反射获取
2.1 首先获取class 对象
// 通过类路径来获取(较常用)
1. Class<?> aClass = Class.forName("com.example.demo.model.ReflectBean");
// 直接通过类.class 获取
2. Class<ReflectBean> reflectBeanClass = ReflectBean.class;
// 通过实例来获取
3. ReflectBean reflectBean = new ReflectBean();
Class<? extends ReflectBean> aClass1 = reflectBean.getClass();
2.2 获取类的属性值
@Test
void getFields() throws IllegalAccessException {
ReflectBean reflectBean = new ReflectBean();
Class<? extends ReflectBean> aClass = reflectBean.getClass();
Field[] fields = aClass.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
//设置暴力访问 破坏封装,可以调用私有成员
field.setAccessible(true);
// 设置字段值
field.set(reflectBean,"name");
}
}
2.3 获取类的方法
@Test
void getMethod() throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
Class<?> aClass = Class.forName("com.example.demo.model.ReflectBean");
//获取实例对象
Object o = aClass.newInstance();
Method[] methods = aClass.getMethods();
for (Method method : methods) {
System.out.println("修饰符: " + method.getModifiers());
System.out.println("返回值: " + method.getReturnType());
System.out.println("方法名称: " + method.getName());
System.out.println("参数列表: " + method.getParameterTypes());
if (method.getName().equals("invokeTest")) {
// 反射调用方法 第一个参数是对象的实例 后面是方法的参数
Object code = method.invoke(o, "code", 10);
System.out.println("调用addResult后的运行结果:" + code);
}
}
}
运行结果
2.4 获取类上面的注解
@Test
void getAnno() throws ClassNotFoundException {
Class<?> aClass = Class.forName("com.example.demo.model.ReflectBean");
MyAnno annotation = aClass.getAnnotation(MyAnno.class);
Map<String, Object> attributes = AnnotationUtils.getAnnotationAttributes(annotation);
Object userCode = attributes.get("userCode");
System.out.println(userCode);
System.out.println(annotation.id());
System.out.println(annotation.userCode());
}
结果