java反射--如何改變private中的變量及方法

轉載自:http://blog.csdn.net/z69183787/article/details/23289099

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 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類型的屬性

發佈了17 篇原創文章 · 獲贊 34 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章