1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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方法
1
2
3
|
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.
接下來是:
1
2
3
|
DemoTest test=(DemoTest)cons.newInstance( new Object[]{}); //生成相應的對象。參數new Object[]{} 就是構造方法對應的參數的具體值。如剛才的: DemoTest test=(DemoTest)cons.newInstance( new Object[]{“李車”, "張三" }); |
接下來:
1
2
3
|
Method method=clazz.getMethod( "getName" , new Class[]{String. class }); method.invoke(test, new Object[]{ "王五" }); |
這時就可以打印出王五了。
那要如何把name為private 的值進行改變呢。
1。先得到field,
1
|
Field field=clazz.getDeclaredField( "name" ); |
2.將此對象的 accessible 標志設置為指示的布爾值。值為 true 則指示反射的對象在使用時應該取消 Java 語言訪問檢查。值為 false 則指示反射的對象應該實施 Java 語言訪問檢查。
1
|
field.setAccessible( true ); |
3.對變量值進行修改
1
|
field.set( "name" , "王五" ); |
OK;
要訪問私有的方法也是一樣。
1
2
3
4
5
|
Method method=clazz.getDeclaredMethod( "getName2" ); method.setAccessible( true ); method.invoke(test, new Object[]{ "王五" }); |
用getDeclaredFields就能得到private 和public protend protected 的字段
如果用c.getFields();只能得到public類型的屬性
以上這篇java反射_改變private中的變量及方法的簡單實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。