如何获得对象属性

steryzone 2011-05-14 05:24:44

定义
public void testMethod(List list){
在这里,怎样得到list里面的对象呢? <------------问题在这
}

调用方法1
List list = new ArrayList();
for(int i=0;i<10;i++){
User user = new User();
user.setName="lilei"+i;
list.add(user);
}
testMethod(list);

调用方法2
List list = new ArrayList();
for(int i=0;i<10;i++){
Person person = new Person();
person .setPersonName="lilei"+i;
list.add(person );
}

testMethod(list);



我的list里面装的是对象,但每次对象可能不一样
有时是User这个对象,有时是Person这个对象或者是其它

...全文
220 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
BearKin 2011-05-16
  • 打赏
  • 举报
回复
........有必要这么麻烦么..还用到反射... 2L的建议不就很好么
Ade子夜 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 inhibitory 的回复:]

Java code
import java.lang.reflect.Field;

public class Test {
public static void main(String[] args) throws SecurityException,
NoSuchFieldException, IllegalArgumentException,
……
[/Quote]
ding!!!
Inhibitory 2011-05-16
  • 打赏
  • 举报
回复
Field getField(String name)
Returns a Field object that reflects the specified public member field of the class or interface represented by this Class object.



Field getDeclaredField(String name)
Returns a Field object that reflects the specified declared field of the class or interface represented by this Class object.
Inhibitory 2011-05-16
  • 打赏
  • 举报
回复
import java.lang.reflect.Field;

public class Test {
public static void main(String[] args) throws SecurityException,
NoSuchFieldException, IllegalArgumentException,
IllegalAccessException {
User2 user = new User2("Biao");
Class clazz = user.getClass();

// 使用Declared Field: 可以取得所有类型的属性,如public, protected, private
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
Object obj = field.get(user);
System.out.println(obj);

// 使用Field: 只能取得public的属性
for (Field f : clazz.getFields()) {
System.out.println(f.getName());
}
}
}

class User2 {
private String name;

public User2() {
}

public User2(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}
steryzone 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 inhibitory 的回复:]
使用反射取得对象声明的属性值

Java code
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class Test {
public static void main(String[] args) {
test1();……
[/Quote]
就是这个,这个就是我想要的。。
但是想问下,我之前在网上也搜过类似的,我也试过,但不行。。
看了你这个后再去试了下也不行
不知道问题在那呢?

public void testMethod(List list){
Class object = list.get(0).getClass();
Field field = object.getField("name"); <----这时这里会报一个找不到对应方法的错
Object obj = field.get(object);
System.out.println(obj);
}
mtv0199 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 steryzone 的回复:]

引用 26 楼 bearkin 的回复:
........有必要这么麻烦么..还用到反射... 2L的建议不就很好么

2楼的是好,但是不是我要的
我要的不是针对2个对象,有可能是几十个类对象,难道我每多一个类就再判断下?
[/Quote]
参考这么多对象,你为什么不把属性的分析交给每个类自己去完成,偏偏用一个公共的方法来分析。这些类很相似吗?
用一个方法去分析几十个对象,还引入了反射,确实不是一个好办法。
steryzone 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 bearkin 的回复:]
........有必要这么麻烦么..还用到反射... 2L的建议不就很好么
[/Quote]
2楼的是好,但是不是我要的
我要的不是针对2个对象,有可能是几十个类对象,难道我每多一个类就再判断下?
凉岑玉 2011-05-15
  • 打赏
  • 举报
回复
楼主的也就两种类型·先使用Object将list里的对象拿到··然后try{强制转换成User}catch{转换成Person}``这样应该也可以··
mtv0199 2011-05-15
  • 打赏
  • 举报
回复
声明一个接口Testable,有一个方法test(),list里面的类去实现Testalbe接口,test里面放该类需要测试的方法。

public class User implements Testable(){
public void test(){
//user需要测试的东西
}
}
public class People implements Testable(){
public void test(){
//people需要测试的东西
}
}
public void testMethod(List<Testable> list){
//list.get(index).test 这样测试
}
Inhibitory 2011-05-15
  • 打赏
  • 举报
回复
使用反射取得对象声明的属性值
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class Test {
public static void main(String[] args) {
test1();

test2();
}

public static void testMethod(List list) throws IllegalArgumentException,
IllegalAccessException {
for (Object obj : list) {
// 取得类中声明的属性
Field[] fields = obj.getClass().getDeclaredFields();
for (Field f : fields) {
// 取得此对象中每个属性的值
f.setAccessible(true); // 设置protected, private属性可以访问,否则会抛异常
System.out.println(f.get(obj));
}
}
}

public static void test1() {
List list = new ArrayList();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setName("lilei" + i);
list.add(user);
}
try {
testMethod(list);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}

public static void test2() {
List list = new ArrayList();
for (int i = 0; i < 10; i++) {
Person person = new Person();
person.setPersonName("Goooooo" + i);
list.add(person);
}

try {
testMethod(list);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}

class User {
private String name;

public String getName() {
return name;
}

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

}

class Person {
private String personName;

public String getPersonName() {
return personName;
}

public void setPersonName(String personName) {
this.personName = personName;
}

}
healer_kx 2011-05-14
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 steryzone 的回复:]

引用 2 楼 healer_kx 的回复:
好几个办法,
1. User和Person有一个共同的基类:


Java code
import java.util.ArrayList;


abstract class People
{
private String name;

void setName(String name)
{
this.name = nam……
[/Quote]

第一,如果它们没有共性,那你确实应该像火龙果说的,分开Test~
第二,确实可以用反射,但是没有共性,也要找出来共性嘛,你做出来一个函数里面能处理多种类型的。
不是对象有共性,也得找个有共性的元数据描述它们。
steryzone 2011-05-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 healer_kx 的回复:]
好几个办法,
1. User和Person有一个共同的基类:


Java code
import java.util.ArrayList;


abstract class People
{
private String name;

void setName(String name)
{
this.name = nam……
[/Quote]
不一定有相同的。。。。。这只是我举例
qingjiaowoshuaige 2011-05-14
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20110514/22/2d7c5b42-f611-4c88-8b1b-68cc5f4fd63a.html?02310356600110488
求帮助
steryzone 2011-05-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 inhibitory 的回复:]
要不就用反射试试
[/Quote]
反射是怎样的?
Inhibitory 2011-05-14
  • 打赏
  • 举报
回复
要不就用反射试试
Inhibitory 2011-05-14
  • 打赏
  • 举报
回复
获得对象的属性,对象的什么属性?
healer_kx 2011-05-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 steryzone 的回复:]

引用 1 楼 gray_sky 的回复:
不知道我理解的对不对!~

lz可以声明成员变量List,该list存的是Object

但是在取的时候楼主可以用instanceof判断一下是那个类型,再做处理!~


我现在是举例有User或者Person,实际可能有100多个情况,不可能一个一个判断阿
[/Quote]

哦,那就我的办法好了,抽象出来一个基类或者接口。
steryzone 2011-05-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gray_sky 的回复:]
不知道我理解的对不对!~

lz可以声明成员变量List,该list存的是Object

但是在取的时候楼主可以用instanceof判断一下是那个类型,再做处理!~
[/Quote]

我现在是举例有User或者Person,实际可能有100多个情况,不可能一个一个判断阿
BearKin 2011-05-14
  • 打赏
  • 举报
回复
...具体还是看对这些对象的操作
zhaozhiqiang1981 2011-05-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gray_sky 的回复:]
不知道我理解的对不对!~

lz可以声明成员变量List,该list存的是Object

但是在取的时候楼主可以用instanceof判断一下是那个类型,再做处理!~
[/Quote]

这个好,就是可能要写好多个判断。
加载更多回复(7)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧