动态调用私有域和私有方法

1、定义一个含私有方法的类

public class PrivateMethod
{
    private String name;
    
    private String sayHello()
    {
        return "Hello " + name + "!";
    }

    public String getName()
    {
        return name;
    }   
}

2、动态调用该私有方法。注意在动态调用私有方法的过程中,必须压制java的访问检查,否则在调用私有域或私有方法的时候会出现无法访问的错误。

import java.lang.reflect.Method;

/**
 * 动态调用私有方法
 *
 */
public class TestPrivateMethod
{
    public static void main(String[] args) throws Exception
    {
        PrivateMethod p =new PrivateMethod();
        
        Class classType = p.getClass();
        
        //此处用getDeclaredField可以获取私有域,getField只可以得到公有域
        Field field = classType.getDeclaredField("name");
        /**
         * 压制java的访问检查,true为压制;false为按照原来的策略进行,既不压制。
         * 此处必须压制,否则下面的调用发生访问私有域失败
         */
        field.setAccessible(true);
        field.set(p, "Tom");
        
        System.out.println(p.getName());
        
        //此处用getDeclaredMethod可以获取私有方法,getMethod只可以得到公有方法
        Method  method = classType.getDeclaredMethod("sayHello", new Class[] {});
        
        /**
         * 压制java的访问检查,true为压制;false为按照原来的策略进行,既不压制。
         * 此处必须压制,否则下面的调用发生访问私有方法失败
         */
        method.setAccessible(true);
        
        String str = (String)method.invoke(p, new Object[] {});
        System.out.println(str);
        
    }
}

上一篇:java.lang.reflect.Array类
下一篇:代理模式

你可能感兴趣的:(动态调用私有域和私有方法)