黑马程序员技术交流社区
标题:
通过反射获取变量。改变值,打印,高新视频
[打印本页]
作者:
余善航
时间:
2013-3-7 21:50
标题:
通过反射获取变量。改变值,打印,高新视频
//定义一个类,定义几个String 的成员变量
public class LeiDeBianLian {
private int y;
public int x;
String aa="sad";
String sd="sdadas";
String dsa="sadasd";
public LeiDeBianLian(int y, int x) {
super();
this.y = y;
this.x = x;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return aa+" : "+sd+" : "+dsa;
}
}
import java.lang.reflect.Field;
public class HuoQuBianLiang {
/**
* @param args
* @throws NoSuchFieldException
* @throws SecurityException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
// TODO Auto-generated method stub
LeiDeBianLian l=new LeiDeBianLian(3,56);
Tong(l);
System.out.println(l);
}
private static void Tong(Object obj) throws IllegalArgumentException, IllegalAccessException
{
Field[] fields=obj.getClass().getFields();
for(Field field : fields)
{
if(field.getType()==String.class)
{
String oldStr=(String) field.get(obj);
String newStr=oldStr.replace('a', 'g');
field.set(obj, newStr);
}
// 这个例子的String的变量值没有被改变 ,
// 可能晕了,不知道怎么弄了
作者:
夏振博
时间:
2013-3-7 22:12
本帖最后由 夏振博 于 2013-3-8 01:18 编辑
Field[] fields=obj.getClass().getFields();//getFields();是返回所有可访问公共字段,你的String都是默认的 不是public的 所以拿不到
Field[] fields = obj.getClass().getDeclaredFields();//这个方法是拿到所有的字段,当然,其中可能会有私有的需要改变下访问权限,(暴力访问)setAccessible(true);,这样可以修改
你也可以把那些String 都定义为public 这样getFields();方法可以拿到字段,这样也可以修改
作者:
cyh8807
时间:
2013-3-7 23:51
private static void Tong(Object obj) throws IllegalArgumentException,
IllegalAccessException {
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
if (field.getType() == String.class) {
String oldStr = (String) field.get(obj);
String newStr = oldStr.replace('a', 'g');
field.set(obj, newStr);
}
}
}
复制代码
将你这个方法区的代码这样修改下就可以得到你想要的答案了
原因是:public
Field
[]
getFields
() throws
SecurityException 该方法返回该接口及其所有超接口的公共字段。
而你的代码成员变量是默认的,默认的就不是public
public
Field
[]
getDeclaredFields
() throws
SecurityException
该方法返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。
field.setAccessible(true); 该行代码的意思将所有字段都设置为可以访问的
作者:
夏晓彤
时间:
2013-3-8 01:09
楼上的说的都差不多了,之前我也和你犯了错同样的错误,不过,我把变量默认修饰类型当成了public,浪费了好多时间,才找到错误
你还可以把 String aa="sad";
String sd="sdadas";
String dsa="sadasd";
改成
public String aa="sad";
public String sd="sdadas";
public String dsa="sadasd";
如果不改只能用暴力反射了
用getDeclaredFields()方法和setAccessible(true)方法
作者:
陈丽莉
时间:
2013-3-8 23:29
如果问题清楚了,请将帖子分类改成【已解决】。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2