天天看點

Java反射進階應用--利用反射調用類的私有方法修改私有方法值,以及替換Java的類成員資料

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;