Java通过反射机制获取数据类对象的属性及方法

一、通过反射机制获取类对象的所有属性以及相应的get、set方法

1.遍历类对象的所有属性

//可以使用getDeclaredFields()方法获取对象的所有属性
AutoClass autoClass = new AutoClass();		// 先初始化一个类
Field[] fields = autoClass.getClass().getDeclaredFields();	// 获取对象的所有属性
for (Field item : fields) {
    String name = item.getName();	// 获取对象属性名
    String typeName = item.getGenericType().getTypeName();	// 获取对象属性的类型
    System.out.printf("属性名:%s,类型:%s\n", name, typeName);
}

2.获取属性的get、set方法

// 一般而言每个属性都有其get和set方法
// 通过方法名获取get方法
Method getMethod = autoClass.getClass().getMethod("getId");
// 调用get方法
String invoke = (String) getMethod.invoke(autoClass);
System.out.println(invoke);

// 通过方法名获取set方法,由于set方法是有参数的,所以这里也需要定义set方法的参数类型
Method setMethod = autoClass.getClass().getMethod("setId", String.class);
// 调用set方法
setMethod.invoke(autoClass, "gftz");
System.out.println(autoClass.getId());

// invoke方法中的autoClass表示autoClass这个指定对象调用相应方法

二、通过反射机制实现类对象的实例化

1.工具类

package utils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.Date;

/**
 * @description: 数据类的相关操作
 * @author: 黄珺瑜
 * @create: 2022-07-07 22:05
 **/
// 由于为了让这个工具类能够通用,故而用了泛型,对其不了解需要自行百度一下。
public class ObjectOperate<T> {

/**
 * 设置数据类对象的属性
 * @param obj   数据类对象的实例
 * @param name  属性名
 * @param type  属性类型名
 * @param val   需要存入的属性值
 * @throws NoSuchMethodException
 * @throws InvocationTargetException
 * @throws IllegalAccessException
 */
    public void setValues(T obj, String name, String type, Object val) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Method method = null;
        // 通过属性类型来获取相应的方法以及强制转化属性值并初始化相应属性
        // 这里考虑到了大部分常用的数据类型,可拿来即用。
        switch (type){
            case "int":
                method = obj.getClass().getMethod(name, int.class);
                method.invoke(obj,(int)val);
                break;
            case "short":
                method = obj.getClass().getMethod(name, short.class);
                method.invoke(obj,(short)val);
                break;
            case "long":
                method = obj.getClass().getMethod(name, long.class);
                method.invoke(obj,(long)val);
                break;
            case "float":
                method = obj.getClass().getMethod(name, float.class);
                method.invoke(obj,(float)val);
                break;
            case "double":
                method = obj.getClass().getMethod(name, double.class);
                method.invoke(obj,(double)val);
                break;
            case "boolean":
                method = obj.getClass().getMethod(name, boolean.class);
                method.invoke(obj,(boolean)val);
                break;
            case "java.lang.String":
                method = obj.getClass().getMethod(name, String.class);
                method.invoke(obj,(String)val);
                break;
            case "java.util.Date":
                method = obj.getClass().getMethod(name, Date.class);
                method.invoke(obj,(Date)val);
                break;
            case "java.math.BigDecimal":
                method = obj.getClass().getMethod(name, BigDecimal.class);
                method.invoke(obj,(BigDecimal)val);
                break;
        }
    }
}

2、使用案例

// 模拟案例数据
List<Object> params = new ArrayList<>();
params.add(UUID.randomUUID().toString().replaceAll("-", ""));
params.add(18);
params.add(new Date());
params.add(false);
params.add(new BigDecimal(888888.8));

// 初始话类型操作的工具类
ObjectOperate<AutoClass> objectOperate = new ObjectOperate<>();
// AutoClass使用到上面的,故不再给出AutoClass类
AutoClass autoClass = new AutoClass();
Field[] fields = autoClass.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
    String name = fields[i].getName();	// 属性名
    // 设置为属性的set方法名,如:属性名为id,对应set方法名为setId
    name = "set"+name.substring(0, 1).toUpperCase() + name.substring(1);
    String typeName = fields[i].getGenericType().getTypeName();	//属性类型名
    try {
        objectOperate.setValues(autoClass,name,typeName,params.get(i));	// 初始化对象的属性
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
System.out.println(autoClass.toString());

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值