Java 反射机制示例

Java反射的用法

主要反射API,用来生成在当前JAVA虚拟机中的类、接口或者对象的信息。

1.Class类:反射的核心类,可以获取类的属性,方法等内容信息。

2.Field类:Java.lang.reflect.表示类的属性,可以获取和设置类的中属性值。

3.Method类:Java.lang.reflect,表示类的方法,它可以用来获取类中方法的信息或者执行方法

4.Construcor类:Java.lang.reflect,表示类的构造方法。

下面是示例代码:

实体类:

public class UserEntity {

    private Integer userId;

    private String userName;

    private String userSex;

    private Integer userAge;

    public UserEntity() {}

    public UserEntity(Integer userId, String userName, String userSex, Integer userAge) {
        this.userId = userId;
        this.userName = userName;
        this.userSex = userSex;
        this.userAge = userAge;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserSex() {
        return userSex;
    }

    public void setUserSex(String userSex) {
        this.userSex = userSex;
    }

    public Integer getUserAge() {
        return userAge;
    }

    public void setUserAge(Integer userAge) {
        this.userAge = userAge;
    }

    @Override
    public String toString() {
        return "UserEntity{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", userSex='" + userSex + '\'' +
                ", userAge=" + userAge +
                '}';
    }
}

util类:


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;

public class ReflectUtil<T> {

    /**
     * 方法用途: 给实体属性赋值<br/>
     * 操作步骤: TODO<br/>
     * ${tags}
     */
    public static <T> Object getObject(Class<T> clazz, Map<String, Object> map) {
        Object obj = null;
        try {
            // 构造方法;如果包含参数,并给属性赋值clazz.getConstructor(Integer.class,String.class,String.class,Integer.class)
            Constructor constructor = clazz.getConstructor();
            // 有参构造方法constructor.newInstance(110,"张三丰","man",99),等价new UserEntity(110,"张三丰","man",99)
            obj = constructor.newInstance();
            // 无构造函数,给属性赋值
            Method method = null;
            // getFields只能拿到public属性,想要拿到private属性就用getDeclaredFields
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                // 将field可见性设置为true,默认为false(如果没有设为true报错)
                field.setAccessible(true);
                // 属性类别:Integer、String、Boolean等
                String fieldType = field.getType().getName();
                // 属性名称
                String fieldName = field.getName();
                if (fieldType.equals("java.lang.Boolean")) {
                    method = clazz.getDeclaredMethod("is" + getMethodName(fieldName), field.getType());
                } else {
                    method = clazz.getDeclaredMethod("set" + getMethodName(fieldName), field.getType());
                }
                /*if (fieldType.equals("java.lang.Integer")) {
                    method = clazz.getDeclaredMethod("set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1), Integer.class);
                } else if (fieldType.equals("java.lang.String")) {
                    method = clazz.getDeclaredMethod("set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1), String.class);
                }*/
                for (String key : map.keySet()) {
                    if (fieldName.equals(key)) {
                        // 给属性赋值,等价于set方法(xxx.set())
                        method.invoke(obj, map.get(key));
                        break;
                    }
                }
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return obj;
    }

    public static void getMethod(Class clazz) {
        try {
            Method method = clazz.getDeclaredMethod("getUserId");
            System.out.println(method.getName());
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    /**
     * 方法用途: 获取实体所有属性值<br/>
     * 操作步骤: TODO<br/>
     * ${tags}
     */
    public static void getBeanValues(Object object) {
        Class clazz = object.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            // 同样需要先将field可见性设为可见
            field.setAccessible(true);
            try {
                // field.get() 获取属性值
                System.out.println(field.get(object));;
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 方法用途: 把一个字符串的第一个字母大写、效率是最高的<br/>
     * 操作步骤: TODO<br/>
     * ${tags}
     */
    private static String getMethodName(String fildeName) {
        byte[] items = fildeName.getBytes();
        items[0] = (byte) ((char) items[0] - 'a' + 'A');
        return new String(items);
    }
    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<>();
        map.put("userId", 110);
        map.put("userName", "张三丰");
        map.put("userSex", "man");
        map.put("userAge", 99);
        UserEntity userEntity = (UserEntity) ReflectUtil.getObject(UserEntity.class, map);
        ReflectUtil.getMethod(UserEntity.class);
        ReflectUtil.getBeanValues(userEntity);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值