当前位置: 代码网 > it编程>编程语言>Java > Java如何通过反射机制获取数据类对象的属性及方法

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

2025年01月20日 Java 我要评论
一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性//可以使用getdeclaredfields()方法获取对象的所有属性autoclass autoclass

一、通过反射机制获取类对象的所有属性以及相应的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());

到此这篇关于java如何通过反射机制获取数据类对象的属性及方法的文章就介绍到这了,更多相关java反射获取数据类对象的属性内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com