如何利用java反射顺序的从一个java类中得到其中定义的成员变量名或者方法
答案:3 悬赏:80
解决时间 2021-01-15 15:34
- 提问者网友:斑駁影
- 2021-01-15 04:29
如何利用java反射顺序的从一个java类中得到其中定义的成员变量名或者方法
最佳答案
- 二级知识专家网友:痴妹与他
- 2021-01-15 05:30
我不太明白你问题的意思
不知道为什么你理解的那么复杂,对于java的反射是可以直接获取字段Field的,而每一个Field都有其get set方法就相当于getXXX和setXXX了
我不知道你这个ArrayList里面装的是什么,写个小例子,我理解你需要处理的大概也就是这样吧
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class A {
private String field1;
private String field2;
public String getField1() {
return field1;
}
public void setField1(String field1) {
this.field1 = field1;
}
public String getField2() {
return field2;
}
public void setField2(String field2) {
this.field2 = field2;
}
public static void main(String[] args) {
A a = new A();
a.field1 = "1";
a.field2 = "2";
for(Field field:A.class.getDeclaredFields()){
try {
System.out.println(field.get(a));
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} 另外List只是一个集合,也就是某种意义上来说是无序的,他的顺序是以装载的顺序定义的,你如何保证List中的数据顺序与类的属性定义顺序是一样的??这种用HashMap是不是要好点??
追问List<>中存放每条数据库记录,比如对应DB中student表中的一条记录,对应java的是每一个student类的对象,要按照student类中属性的顺序写入到Excel中。你给的程序是可以的,但不知道是否能保证for循环field数组中方法顺序和类中声明的顺序一致么?getDeclaredFields方法在API中有说明:返回数组中的元素没有排序,也没有任何特定的顺序。追答其实List也是有顺序的,他是按照队列方式加入数据的,那么你只要保证Excel中的单元格定义与Student的属性定义是一致的就行了。
比如Student的属性定义为id,name,sex,age那么取出的Field的顺序也是id,name,sex,age,这个并不冲突
不知道为什么你理解的那么复杂,对于java的反射是可以直接获取字段Field的,而每一个Field都有其get set方法就相当于getXXX和setXXX了
我不知道你这个ArrayList里面装的是什么,写个小例子,我理解你需要处理的大概也就是这样吧
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class A {
private String field1;
private String field2;
public String getField1() {
return field1;
}
public void setField1(String field1) {
this.field1 = field1;
}
public String getField2() {
return field2;
}
public void setField2(String field2) {
this.field2 = field2;
}
public static void main(String[] args) {
A a = new A();
a.field1 = "1";
a.field2 = "2";
for(Field field:A.class.getDeclaredFields()){
try {
System.out.println(field.get(a));
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} 另外List只是一个集合,也就是某种意义上来说是无序的,他的顺序是以装载的顺序定义的,你如何保证List中的数据顺序与类的属性定义顺序是一样的??这种用HashMap是不是要好点??
追问List<>中存放每条数据库记录,比如对应DB中student表中的一条记录,对应java的是每一个student类的对象,要按照student类中属性的顺序写入到Excel中。你给的程序是可以的,但不知道是否能保证for循环field数组中方法顺序和类中声明的顺序一致么?getDeclaredFields方法在API中有说明:返回数组中的元素没有排序,也没有任何特定的顺序。追答其实List也是有顺序的,他是按照队列方式加入数据的,那么你只要保证Excel中的单元格定义与Student的属性定义是一致的就行了。
比如Student的属性定义为id,name,sex,age那么取出的Field的顺序也是id,name,sex,age,这个并不冲突
全部回答
- 1楼网友:詩光轨車
- 2021-01-15 07:15
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
System.out.println("name====="+fieldName);
String firstLetter = fieldName.substring(0, 1).toUpperCase();
// 获得和属性对应的getXXX()方法的名字
String getMethodName = "get" + firstLetter + fieldName.substring(1);
// 获得和属性对应的getXXX()方法
Method getMethod = classType.getMethod(getMethodName, new Class[]{});
// 调用原对象的getXXX()方法
Object value = getMethod.invoke(object, new Object[]{});
System.out.println("value===="+value);
}追问http://bbs.csdn.net/topics/390251554 文章中间提到 “我用几乎相似的方法,但获取到的成员变量的顺序却与类声明时候的顺序不一样”,这个怎么解决?追答你要么维护一个属性,这个属性里边按顺序放入get方法名,反射时直接获取方法名
Field field = fields[i];
String fieldName = field.getName();
System.out.println("name====="+fieldName);
String firstLetter = fieldName.substring(0, 1).toUpperCase();
// 获得和属性对应的getXXX()方法的名字
String getMethodName = "get" + firstLetter + fieldName.substring(1);
// 获得和属性对应的getXXX()方法
Method getMethod = classType.getMethod(getMethodName, new Class[]{});
// 调用原对象的getXXX()方法
Object value = getMethod.invoke(object, new Object[]{});
System.out.println("value===="+value);
}追问http://bbs.csdn.net/topics/390251554 文章中间提到 “我用几乎相似的方法,但获取到的成员变量的顺序却与类声明时候的顺序不一样”,这个怎么解决?追答你要么维护一个属性,这个属性里边按顺序放入get方法名,反射时直接获取方法名
- 2楼网友:人類模型
- 2021-01-15 06:58
下一个单元格要写入的是类中的什么字段(getXxx()方法),也就说要保证提取到
的get方法或成员变
的get方法或成员变
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息