使用反射调用私有方法

使用反射调用私有方法

?获取私有方法的步骤:
1.获取目标类
2.获取目标方法

Method method=clazz.getDeclaredMethod(name);//可以调用类中的所有方法(不包括父类中继承的方法)
Method method=clazz.getMethod(name);//可以调用类中有访问权限的方法(包括父类中继承的方法)

3.method.toGenericString()或method.toString()方法来输出方法的字符串形式

toGenericString()
返回描述此 Method 的字符串,包括类型参数。

toString()
返回描述此 Method 的字符串。

4.使用invoke()方法调用方法
?案例:
1.创建一个Person类,写几个方法

package yaya;
/**
 * 创建一个Person类,写几个方法
 */
public class Person {
    public void eat() {
        System.out.println("我在吃");
    }
    public void run() {
        System.out.println("我在跑");
    }
    //加个私有方法,用于测试
    private void eat(String name) {
        System.out.println("我是"+name+",我在吃");
    }
    public void eat(String name,int count) {
        System.out.println("我是"+name+",我在吃"+count+"只牛蛙");
    }
 
}

2.使用反射调用私有方法

package yaya;
 
import java.lang.reflect.Method;
 
/**
* 使用反射调用私有方法
*/
public class ReflectDemo5 {
 
    public static void main(String[] args) throws Exception {
      //通过Class的静态方法forName加载Person
        Class cls=Class.forName("yaya.Person");
        //实例化对象的方法
        Object o=cls.newInstance();
        /*
         * 在类的外部通过反射调用私有方法会破坏封装性如不是必要操作或设计需求,不建议这样做。
         */
        Method m= cls.getDeclaredMethod("eat",String.class);
        //在访问私有方法前设置访问操作(不设置直接调用会报错)
        m.setAccessible(true);
        m.invoke(o,"佩奇");
         
    }
 
}

?注意:使用继承父类(AccessibleObject类)来的setAccessible()方法,来设置或取消访问检查,以达到访问私有对象的目的。


版权声明:本文为m0_61350160原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。