java反射_改變private中的變量及方法的簡單實例
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中的變量及方法的簡單實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
如何使用Spring-Test對Spring框架進行單元測試
這篇文章主要介紹了如何使用Spring-Test對Spring框架進行單元測試,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
如何使用@Value和@PropertySource注入外部資源
這篇文章主要介紹了如何使用@Value和@PropertySource注入外部資源的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot應用監(jiān)控帶郵件警報的實現示例
本文主要介紹了SpringBoot應用監(jiān)控帶郵件警報的實現示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02

