java反射_改变private中的变量及方法的简单实例
程序员文章站
2024-03-12 14:31:44
java反射_改变private中的变量及方法的简单实例
class demotest{
private string name="123";
p...
java反射_改变private中的变量及方法的简单实例
class demotest{ private string name="123"; public getname(){ system.out.println("public getname " + name); return name; } private getname2(){ system.out.println("private getname2 " + name); return name; } }
如这个,要改变name的值。如何改变。通过java反射如何改变
先来看看如何用反射来调用getname方法
class<demotest> calzz=demotest.class; constructor cons=clazz.getconstructor(new class[]{});//这个是得到class对象的构造方法。参数为构造方法的参数的类的对象。
如:demotest有一个构造方法为public demotest(string arg0,string arg1){......}
这时,constructor cons=clazz.getconstructor(new class[]{string.class,string.class});两个string.calss分别对应arg0,arg1.
接下来是:
demotest test=(demotest)cons.newinstance(new object[]{});//生成相应的对象。参数new object[]{} 就是构造方法对应的参数的具体值。如刚才的: demotest test=(demotest)cons.newinstance(new object[]{“李车”,"张三"});
接下来:
method method=clazz.getmethod("getname",new class[]{string.class}); method.invoke(test,new object[]{"王五"});
这时就可以打印出王五了。
那要如何把name为private 的值进行改变呢。
1。先得到field,
field field=clazz.getdeclaredfield("name");
2.将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 java 语言访问检查。值为 false 则指示反射的对象应该实施 java 语言访问检查。
field.setaccessible(true);
3.对变量值进行修改
field.set("name","王五");
ok;
要访问私有的方法也是一样。
method method=clazz.getdeclaredmethod("getname2"); method.setaccessible(true); method.invoke(test,new object[]{"王五"});
用getdeclaredfields就能得到private 和public protend protected 的字段
如果用c.getfields();只能得到public类型的属性
以上这篇java反射_改变private中的变量及方法的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。