通过反射访问类中的私有方法和属性

给出一个如下类:
package  test2;
public  class  MathDemo {
     private  int  m  =  10;
    
     private  MathDemo(){
        
    }
    
     private  int  add( int  a, int  b){
         return  a + b;
    }
    
     public  int  getM() {
         return  m;
    }
}
 要求创建该类对象,调用add方法,改变m的值

首先我们要了解三个反射包中的类:
Constructor:代表类的单个构造方法,通过 Constructor我们可以执行一个类的某个构造方法(有参或无参)来创建对象。
Method:代表类中的单个方法,可以用于执行类的某个普通方法,有参或无参,并可以接收返回值。
Field:代表类的单个属性,用于set或get该属性。
AccessibleObject:以上三个类的父类,提供了对构造方法、普通方法、和属性的访问控制的能力。

使用Class类中的方法可以获取该类的所有 Constructor对象、 Method对象和 Field对象,但是仍然无法访问私有化的构造方法普通方法和私有属性,此时我们可以使用他们继承父类( AccessibleObject类)来的 setAccessible()方法,来设置或取消访问检查,以达到访问私有对象的目的。

 
package  test2;
import  java. lang. reflect. Constructor;
import  java. lang. reflect. Field;
import  java. lang. reflect. Method;
/**
 * 
 *  @author  
 *  @date  2015-08-31 13:55:16
 */
public  class  Demo {
     public  static  void  main( String[]  argsthrows  Exception {
         /*
          * 使
          * MathDemo
          * private MathDemo()
          */
         //1.
         Constructor < MathDemo >  constructor  =  MathDemo. class. getDeclaredConstructor();
         //2.访访
         constructor. setAccessible( true);
         //3.
         MathDemo  mathDemo  =  constructor. newInstance();
        
         /*
          *  使
          *  MathDemo
          *  private int add(int a,int b)
          */
         //1.
         Method  method  =  MathDemo. class. getDeclaredMethod( "add"int. class, int. class);
         //2.访访
         method. setAccessible( true);
         //3.
         int   i  = ( Integermethod. invoke( mathDemo1, 2);
         System. out. println( i);
        
         /*
          * 使
          * MathDemo
          * private int m = 10;
          */
         //1.m
         Field  field  =  MathDemo. class. getDeclaredField( "m");
         //2.访访
         field. setAccessible( true);
         //3.m20
         field. setInt( mathDemo20);
         System. out. println( mathDemo. getM());
    }
}
 
执行结果:
3
20

成功创建对象,调用了add方法,改变了m的值。

猜你喜欢

转载自blog.csdn.net/u011213044/article/details/80502132