java反射_改變private中的變量及方法的簡(jiǎn)單實(shí)例
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; } } |
如這個(gè),要改變name的值。如何改變。通過(guò)java反射如何改變
先來(lái)看看如何用反射來(lái)調(diào)用getName方法
1
2
3
|
class <DemoTest> calzz=DemoTest. class ; Constructor cons=clazz.getConstructor( new class []{}); //這個(gè)是得到class對(duì)象的構(gòu)造方法。參數(shù)為構(gòu)造方法的參數(shù)的類的對(duì)象。 |
如:DemoTest有一個(gè)構(gòu)造方法為public DemoTest(String arg0,String arg1){......}
這時(shí),Constructor cons=clazz.getConstructor(new class[]{String.class,String.class});兩個(gè)String.calss分別對(duì)應(yīng)arg0,arg1.
接下來(lái)是:
1
2
3
|
DemoTest test=(DemoTest)cons.newInstance( new Object[]{}); //生成相應(yīng)的對(duì)象。參數(shù)new Object[]{} 就是構(gòu)造方法對(duì)應(yīng)的參數(shù)的具體值。如剛才的: DemoTest test=(DemoTest)cons.newInstance( new Object[]{“李車”, "張三" }); |
接下來(lái):
1
2
3
|
Method method=clazz.getMethod( "getName" , new Class[]{String. class }); method.invoke(test, new Object[]{ "王五" }); |
這時(shí)就可以打印出王五了。
那要如何把name為private 的值進(jìn)行改變呢。
1。先得到field,
1
|
Field field=clazz.getDeclaredField( "name" ); |
2.將此對(duì)象的 accessible 標(biāo)志設(shè)置為指示的布爾值。值為 true 則指示反射的對(duì)象在使用時(shí)應(yīng)該取消 Java 語(yǔ)言訪問(wèn)檢查。值為 false 則指示反射的對(duì)象應(yīng)該實(shí)施 Java 語(yǔ)言訪問(wèn)檢查。
1
|
field.setAccessible( true ); |
3.對(duì)變量值進(jìn)行修改
1
|
field.set( "name" , "王五" ); |
OK;
要訪問(wèn)私有的方法也是一樣。
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中的變量及方法的簡(jiǎn)單實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。