关于反射获得一个对象的引用,然后再另一个地方,如何获取这个对象的数据成员

CHZiroy 2012-04-14 11:45:46
比如这个类的成员有
class B
{
A[] Aset; //某个类对象组成的数组
int name;
}

B b = new B();
下面一个是获取这个对象的引用,获取它的数据成员的方法
void receive_1(ObjectReference r){
B second_b = new B(); //由传过来的r建立新的对象
Field t1 = or.referenceType().fieldByName("name");
Value t1_v = or.getValue(t1);
second_b.name = ((IntegerValue)t1_v).value(); //转化为Int型

Field t2 = or.referenceType().fieldByName("Aset");
Value t2_v = or.getValue(t2);
List<A> L2 = (List<A>)t2_v; //这一步和下一步运行出错,
second_b.Aset = (A[])L2.toArray(); //不知道怎么将获取到的数组的Value还原出来




}
...全文
118 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiongyu2006 2012-04-15
  • 打赏
  • 举报
回复
后面那函数我没看明白,按楼主要求写了一个简单的例子共楼主参考。

package org.reflection.answer;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;

class A
{
private String name;
private Integer age;

public A()
{
super();
}

public A(String name, Integer age)
{
super();
this.name = name;
this.age = age;
}

public String getName()
{
return name;
}

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

public Integer getAge()
{
return age;
}

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

}

class B
{
private A[] Aset;
private int name;

public A[] getAset()
{
return Aset;
}

public void setAset(A[] aset)
{
Aset = aset;
}

public int getName()
{
return name;
}

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

}

public class ReflectionAnswer
{

public static void main(String[] args)
{
B b = new B();
b.setName(100);
b.setAset(new A[] { new A("1", 10), new A("2", 20), new A("3", 30) });

Class<?> cs = b.getClass();
try
{
Field fe_name = cs.getDeclaredField("name");
Field fe_aset = cs.getDeclaredField("Aset");
fe_name.setAccessible(true);
fe_aset.setAccessible(true);
try
{
A[] oj = (A[]) fe_aset.get(b);
List<A> lst = Arrays.asList(oj);
for (A a : lst)
{
System.out.println(a.getName() + ":" + a.getAge());
}
System.out.println(fe_name.get(b));
}
catch (IllegalArgumentException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
catch (SecurityException e)
{
e.printStackTrace();
}
catch (NoSuchFieldException e)
{
e.printStackTrace();
}

}

}


ps,也可以通过Method,然后调用invoke()方法,那样就不用setAccessible了。

62,614

社区成员

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

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