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 {

    /**
     * 方法用途: 给实体属性赋值
* 操作步骤: TODO
* ${tags} */ public static Object getObject(Class clazz, Map 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(); } } /** * 方法用途: 获取实体所有属性值
* 操作步骤: TODO
* ${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(); } } } /** * 方法用途: 把一个字符串的第一个字母大写、效率是最高的
* 操作步骤: TODO
* ${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 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);
    }

你可能感兴趣的:(Java反射机制)