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

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

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

结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值