java 反射私有字段_java-使用反射设置私有字段值

根据Class.getField(强调我的)的Javadoc:

返回一个Field对象,该对象反映此Class对象表示的类或接口的指定公共成员字段。

此方法仅返回公共字段。 由于String str1 = (String) f1.get(cc.getClass());是私人的,因此找不到。

这是一个工作代码:

public class Main {

public static void main(String[] args) throws Exception {

Class> clazz = Class.forName("Child");

Object cc = clazz.newInstance();

Field f1 = cc.getClass().getField("a_field");

f1.set(cc, "reflecting on life");

String str1 = (String) f1.get(cc);

System.out.println("field: " + str1);

}

}

class Father implements Serializable {

public String a_field;

}

class Child extends Father {

//empty class

}

请注意,我还将行String str1 = (String) f1.get(cc.getClass());更改为2988717460985218018049,因为您需要提供字段的对象,而不是类。

如果要保持字段私有,则需要检索getter / setter方法并调用它们。 您提供的代码不起作用,因为要获取方法,还需要指定其参数,因此

cc.getClass().getMethod("setA_field");

一定是

cc.getClass().getMethod("setA_field", String.class);

这是一个工作代码:

public class Main {

public static void main(String[] args) throws Exception {

Class> clazz = Class.forName("Child");

Object cc = clazz.newInstance();

cc.getClass().getMethod("setA_field", String.class).invoke(cc, "aaaaaaaaaaaaaa");

String str1 = (String) cc.getClass().getMethod("getA_field").invoke(cc);

System.out.println("field: " + str1);

}

}

class Father implements Serializable {

private String a_field;

public String getA_field() {

return a_field;

}

public void setA_field(String a_field) {

this.a_field = a_field;

}

}

class Child extends Father {

//empty class

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值