欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java反射_改变private中的变量及方法的简单实例

程序员文章站 2024-03-12 08:13:14
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中的变量及方法的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。