反射的原理

反射的基本操作

实体类

public class Region {
    public Region (){

    }
    public Region (String code,String name){
        this.code = code;
        this.name = name;
    }
    /**
     * 主键
     */
    private Integer id;

    /**
     * 区划编码
     */
    private String code;

    /**
     * 名称
     */
    private String name;

    /**
     * 简称
     */
    private String shortName;

    /**
     * 纬度
     */
    private String lat;

    /**
     * 经度
     */
    private String lng;

    /**
     * 级别
     */
    @WebResponseResultAdvice
    private Integer level;

    /**
     * 父区划编码
     */
    private String parentCode;

    /**
     * 父id
     */
    @WebResponseResultAdvice
    private Integer parentId;

    /**
     * 拼音码
     */
    private String spell;

    /**
     * 上级行政区划的名称列表
     */
    List<String> parentNameList;

    public String whole(String province,String city){
        return province.concat(":").concat(city);
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getShortName() {
        return shortName;
    }

    public void setShortName(String shortName) {
        this.shortName = shortName;
    }

    public String getLat() {
        return lat;
    }

    public void setLat(String lat) {
        this.lat = lat;
    }

    public String getLng() {
        return lng;
    }

    public void setLng(String lng) {
        this.lng = lng;
    }

    public Integer getLevel() {
        return level;
    }

    public void setLevel(Integer level) {
        this.level = level;
    }

    public String getParentCode() {
        return parentCode;
    }

    public void setParentCode(String parentCode) {
        this.parentCode = parentCode;
    }

    public Integer getParentId() {
        return parentId;
    }

    public void setParentId(Integer parentId) {
        this.parentId = parentId;
    }

    public String getSpell() {
        return spell;
    }

    public void setSpell(String spell) {
        this.spell = spell;
    }

    public List<String> getParentNameList() {
        return parentNameList;
    }

    public void setParentNameList(List<String> parentNameList) {
        this.parentNameList = parentNameList;
    }

    @Override
    public String toString() {
        return "Region{" +
                "code='" + code + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

注解类

@Target({ElementType.TYPE,ElementType.FIELD})
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface WebResponseResultAdvice {
}

测试代码

public class Test {

    public static void main(String[] args) throws Exception {
        createRegion();
    }

    /**
     * 1、创建Region 对象
     * 2、调用Region 的有参构造函数,创建对象
     * 3、调用Region的whole方法
     * 4、打印Region除了id字段以外的所有字段名,及字段类型(类名)
     * 5、判断 Region是否有方法setName,调用该方法
     * 6、判断 Region的哪些字段有注解 WebResponseResultAdvice ,并输出这些字段
     * 7、打印所有字符串类型的字段名称
     * 8、如果字段parentNameList的值不为空,打印出字段parentNameList的泛型的类名
     * 9、通过反射复制一个Region对象
     */
    private static void createRegion() throws Exception {
        //1、创建Region 对象
        Class<Region> regionClass = Region.class;
        Region region = regionClass.newInstance();
        System.out.println(region);
        System.out.println("--------------------------------------------------------------------");
        //2、调用Region 的有参构造函数,创建对象
        Constructor<Region> constructor = regionClass.getConstructor(String.class, String.class);
        Region region1 = constructor.newInstance("编码111", "姓名1111");
        System.out.println(region1);
        System.out.println("--------------------------------------------------------------------");
        //3、调用Region的whole方法
        Method whole = regionClass.getDeclaredMethod("whole", String.class, String.class);
        Object invoke = whole.invoke(region, "河南", "郑州");
        System.out.println(invoke.toString());
        System.out.println("--------------------------------------------------------------------");
        //4. 打印Region除了id字段以外的所有字段名,及字段类型(类名)
        Field[] declaredFields = regionClass.getDeclaredFields();
        for (Field field : declaredFields) {
            if ("id".equals(field.getName())) {
                continue;
            }
            System.out.println("字段名字" + field.getName() + "-----字段类型" + field.getType());
        }
        System.out.println("--------------------------------------------------------------------");
        //5.判断 Region是否有方法setName,调用该方法
        Method[] declaredMethods = regionClass.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            if ("setName".equals(declaredMethod.getName())) {
                declaredMethod.invoke(region, "姓名1");
                System.out.println(region);
                break;
            }
        }
        System.out.println("--------------------------------------------------------------------");
        //6、判断 Region的哪些字段有注解 WebResponseResultAdvice ,并输出这些字段
        for (Field field : declaredFields) {
            if (field.isAnnotationPresent(WebResponseResultAdvice.class)) {
                System.out.println("带有WebResponseResultAdvice注解的字段" + field.getName());
            }
        }
        System.out.println("--------------------------------------------------------------------");
        //7.打印所有字符串类型的字段名称
        for (Field field : declaredFields) {
            if (field.getType().equals(String.class)) {
                System.out.println("字符串" + field.getName());
            }
        }
        System.out.println("--------------------------------------------------------------------");
        List<String> parentNameList = new ArrayList<>();
        parentNameList.add("字符1");
        region.setParentNameList(parentNameList);
        //8.如果字段parentNameList的值不为空,打印出字段parentNameList的泛型的类名
        Field parentNameListField = regionClass.getDeclaredField("parentNameList");
        parentNameListField.setAccessible(true);
        Object o = parentNameListField.get(region);
        if (o != null) {
            Type genericType = parentNameListField.getGenericType();
            if (genericType instanceof ParameterizedType) {
                //先转为ParameterizedType类型,调用ParameterizedType中的方法获取
                ParameterizedType pt = (ParameterizedType) genericType;
                Type actualTypeArguments = pt.getActualTypeArguments()[0];
                System.out.println("parentNameList中集合的泛型为" + actualTypeArguments);
            }
        }
        //9.通过反射复制一个Region对象
        region.setCode("测试code1");
        region.setName("测试name1");
        Object region2 = regionClass.newInstance();
        for (Field field : regionClass.getDeclaredFields()) {
            //获取get,set方法
            String getMethodName = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
            String setMethodName = "set" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
            //调用源对象的get方法获取属性值
            Method getMethod = regionClass.getDeclaredMethod(getMethodName);
            Object value = getMethod.invoke(region);
            //调用副本对象的set方法把属性值复制过来
            Method setMethod = regionClass.getDeclaredMethod(setMethodName, field.getType());
            setMethod.invoke(region2, value);
        }
        System.out.println(region);
        System.out.println(region2);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值