package me.test;
import java.lang.reflect.*; //導入反射需要的包
public class ReflectTest {
public static void main(String[] args) throws Exception
{
/* 下面通過反射完成對一個對象中成員的替換
* 并且執行執行私有方法
* 完成對 Poiont類的對象中所有的 String的對象的d換成x
* 并且類中無修改方法
*/
Point pt=new Point(3,5); //建立一個Point對象
Field fx=pt.getClass().getField("x") ; //擷取x的映射類對象
Field fy=pt.getClass().getDeclaredField("y");//因為y是私有的是以要調用這個方法
Method m2=Point.class.getDeclaredMethod("showPrivate") ;//獲得私有方法映射類
//利用反射調用共有輸出
m2.setAccessible(true) ;// 修改showPrivate 權限 改變為可以調用
m2.invoke(pt) ;//執行私有方法
//利用成員反射輸出x 和 私有的 y
System.out.println(fx.getInt(pt));//反射輸出x
fy.setAccessible(true) ;//改變私有為可通路
System.out.println(fy.getInt(pt));//輸出私有y
//替換成員後并且反射私有方法輸出
changeString(pt) ;//反射替換成員值
System.out.println(pt);
}
public static void changeString(Object obj) throws Exception//反射替換對所有String進行替換
{
Field[] f=obj.getClass().getFields() ; //獲得成員映射數組
for(Field tem : f) //疊代for循環
{
if(tem.getType()==String.class) //記憶體中隻有一份String位元組碼
{
String oldString=(String)tem.get(obj) ; //傳回内容
String newString=oldString.replace('d', 'x');//将所有b替換為x
tem.setAccessible(true);
tem.set(obj, newString) ;//替換成員值
}
}
}
public class Point
{
public int x ;
private int y ;
public Point(int x, int y) {
super();
this.x = x;
this.y = y;
public String a="dsfdsfd" ; //隻有 共有可以替換
public String b="fdsfdsfewewwwww" ;
public String c="adddssss" ;
private void showPrivate() //私有方法輸出
System.out.println("x="+this.x+"\n"+"y="+this.y);
System.out.println(this.a);
System.out.println(this.b);
System.out.println(this.c);
public String toString()
return this.a+"\n"+this.b+"\n"+this.c;