java获取类中的属性和值

Posted on   jiaoqing。  阅读(1178)  评论(0编辑  收藏  举报

java中反射是一种非常神奇的机制,通过反射,我可以知道我的某个类含有那些属性,那些方法,继承自那个类,又有什么样的构造方法。如果我们要大量获取类中的内容,但事先我并不知道这个类中有什么样的属性,有什么样的方法,我们该怎么办。按照一般的逻辑,是没办法实现的,因为未知的东西我没办法去已知其属性。这样就通过反射来实现了。

建立一个实体类:Dog

复制代码
public class Dog {
private String name;
private String sex;
private int age;

public Dog() {
}


public Dog(String name, String sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}


public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

}
复制代码

 

然后是一个测试类,Test:

复制代码
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test {
public static void main(String[] args) {
Dog dog = new Dog("小黑", "雄", 2);
show(Dog.class, dog);
}

public static void show(Class<?> clazz, Object obj) {
Field[] fileds = clazz.getDeclaredFields();
for (Field f : fileds) {
System.out.println("----属性:"+getFiled(f)+"--------值:"+getFieldValue(obj, getFiled(f)));
}
}

public static String getFiled(Field f) {
String str = f.toString().substring(f.toString().lastIndexOf('.') + 1,
f.toString().length());
return str.substring(0, 1).toUpperCase() + str.replaceFirst("\\w", "");
}



/**
* 获取对象的属性和属性值
*
* @author ghj
* @param jointPoint
* @return
* @throws Throwable
*/


public static String getFieldValue(Object owner, String fieldName) {
if(invokeMethod(owner, fieldName, null)!=null){
return invokeMethod(owner, fieldName, null).toString();
}else{
return "null";
}
}

/**
*
* 执行某个Field的getField方法
*
* @param owner
* 类
* @param fieldName
* 类的属性名称
* @param args
* 参数,默认为null
* @return
*/
private static Object invokeMethod(Object owner, String fieldName, Object[] args) {
Class<? extends Object> ownerClass = owner.getClass();

// fieldName -> FieldName
String methodName = fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);

Method method = null;
try {
method = ownerClass.getMethod("get" + methodName);
} catch (SecurityException e) {

// e.printStackTrace();
} catch (NoSuchMethodException e) {
// e.printStackTrace();
return "";
}

// invoke getMethod
try {
return method.invoke(owner);
} catch (Exception e) {
return "";
}
}

}
复制代码

 

然后得到测试的结果

----属性:Name--------值:小黑
----属性:Sex--------值:雄
----属性:Age--------值:2

神奇的java

————————————————
版权声明:本文为CSDN博主「等待守护」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/simle_yf_smile/article/details/11975209

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?

随笔 - 287, 文章 - 0, 评论 - 3, 阅读 - 42万

Copyright © 2025 jiaoqing。
Powered by .NET 9.0 on Kubernetes

点击右上角即可分享
微信分享提示