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

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类
下一篇:代理模式

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,295评论 9 118
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,860评论 25 709
  • 我趁着周末回了家,虽然只能待一天但我也是很满足了。我拉着行李箱在回家的路上走着,还遇到了舅舅。 他告诉我他也要去我...
    爱梦的我阅读 139评论 0 0
  • 黑夜给了我思考 白天给了我光明 我用一只眼 览世上的美好 另一只眼 看人间的丑恶 我不愿意 不愿意 同时睁开双眼 ...
    YangJian杨建阅读 716评论 0 4
  • 写在前面:我在以前的文里介绍过我做读书笔记的方法。最近在读一本书《文心》,里面介绍了一些读书笔记的方法,我觉得写的...
    颜小婧阅读 688评论 5 7