反射获取object对象中的所有属性

java反射获取一个object属性值代码解析
主要介绍了java反射获取一个object属性值代码解析,具有一定借鉴价值,需要的朋友可以参考下。
有些时候你明明知道这个object里面是什么,但是因为种种原因,你不能将它转化成一个对象,只是想单纯地提取出这个object里的一些东
西,这个时候就需要用反射了。
假如你这个类是这样的:
private class User {
String userName;
String userPassword;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
}
我们new一个,赋值,向上转型为object
User user = new User();
user.setUserName(“徐风来”);
user.setUserPassword(“1596666”);
Object object = user;
获取属性名,用一个数组保存起来
java.lang.reflect.Field[] fields = object.getClass().getDeclaredFields();
for (java.lang.reflect.Field f : fields) {
Log.i(“xbh”, f.getName());
}
输出
12-17 12:02:10.199 22949-22949/com.example.wechat I/xbh: this$0
12-17 12:02:10.199 22949-22949/com.example.wechat I/xbh: userName
12-17 12:02:10.199 22949-22949/com.example.wechat I/xbh: userPassword
12-17 12:02:10.199 22949-22949/com.example.wechat I/xbh: $change
12-17 12:02:10.199 22949-22949/com.example.wechat I/xbh: serialVersionUID
可以看到出现了我们定义的两个属性名了,另外3个自带的别管了
获取属性值,先获取get方法,再通过调用get方法去取
java.lang.reflect.Method[] method = object.getClass().getDeclaredMethods();//获取所有方法
for(java.lang.reflect.Method m:method) {
System.out.println(m.getName());
if (m.getName().startsWith(“get”)) {
Object o = null;
try {
o = m.invoke(object);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
if (o != null && !“”.equals(o.toString())) {
Log.i(“xbh”, o.toString());
}
}
输出
12-17 12:09:33.429 29677-29677/com.example.wechat I/xbh: 徐风来
12-17 12:09:33.429 29677-29677/com.example.wechat I/xbh: 1596666
那个if语句就是获取get开头的方法
try里面的invoke就是执行这个方法,把返回值放到o里
不通过get方法来获取属性值
java.lang.reflect.Field fi = null;
//获取属性
try {
fi = object.getClass().getDeclaredField(“userName”);
}
catch (NoSuchFieldException e) {
e.printStackTrace();
}
fi.setAccessible(true);
//设置当前对象对model私有属性的访问权限
try {
Log.i(“xbh”, fi.get(object).toString());
}
catch (IllegalAccessException e) {
e.printStackTrace();
}
输出
12-17 12:17:34.419 4732-4732/com.example.wechat I/xbh: 徐风来
直接通过getDeclaredField方法就可以获取(注意和上面的getDeclaredFields方法区分)。但是如果你这个属性是私有的,你肯定就访问不
到,所以这里把这个属性设置为public(setAccessible)就可以访问了。
此外如果你获取的是json数据,想解析里面的1个对象不必了,直接转型成map就可以了。
比如
{“code”:0,“list”:
[{“userName”:“3294727437”,“userPassword”:“xbh1”,“userAvatar”:“https://img1.imgtn.bdimg.com/it/u\u003d37460727\u0026gp\u003d0.jpg”}]}
你通过jsonarray(“list”)获取了后面的集合,再通过get(i)获取了单个的对象。其实一开始的对象是被转成map了,仔细看看是不是。所以
不需要反射获取属性了,直接转型成map就可以取数据了。

Map<string, string=“”> map = (Map<string, string=“”>) u;
map.get(“userAvatar”);</string,></string,>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用反射获取对象并操作属性。下面是一个示例代码,演示了如何使用反射获取类的实例并操作其属性: ```java import java.lang.reflect.Field; public class ReflectionExample { public static void main(String[] args) { // 创建一个对象 MyClass obj = new MyClass(); // 获取对象的类 Class<?> objClass = obj.getClass(); try { // 获取属性 Field field = objClass.getDeclaredField("myField"); // 打开访问权限 field.setAccessible(true); // 获取属性的值 Object value = field.get(obj); System.out.println("原始值:" + value); // 设置属性的值 field.set(obj, "新的值"); // 再次获取属性的值 value = field.get(obj); System.out.println("修改后的值:" + value); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } } class MyClass { private String myField = "初始值"; } ``` 在上面的示例代码,我们首先创建了一个 MyClass 的对象 obj。然后通过 obj.getClass() 方法获取了 obj 对象的类,即 MyClass 类的 Class 对象 objClass。接下来,使用 objClass.getDeclaredField("myField") 方法获取了名为 myField 的私有字段。为了能够访问私有字段,我们通过 field.setAccessible(true) 打开了访问权限。然后,通过 field.get(obj) 方法获取了 myField 的原始值,并打印输出。接着,使用 field.set(obj, "新的值") 方法设置了 myField 的新值。最后,再次使用 field.get(obj) 方法获取 myField 的新值,并打印输出。 需要注意的是,反射操作可能会影响代码的性能和可读性,因此应该谨慎使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值