反射的基本方法 获取 属性 方法 注解

在程序运行时,我们需要获取类的一些信息 我们就可以用到反射来获取

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());
    }

结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hgdzw/article/details/108715500
今日推荐