博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中的反射机制(四) 利用反射访问私有
阅读量:5905 次
发布时间:2019-06-19

本文共 1720 字,大约阅读时间需要 5 分钟。

利用反射调用私有方法、访问私有属性

 

  利用反射,首先是Class对象的获取,之后是Method和Field对象的获取。

  以Method为例,从文档中可以看到:

  getMethod()方法返回的是public的Method对象,

  而getDeclaredMethod()返回的Method对象可以是非public的。

  Field的方法同理。

 

  访问私有属性和方法,在使用前要通过AccessibleObject类(Constructor、 Field和Method类的基类)中的setAccessible()方法来抑制Java访问权限的检查

 

实例1,调用私有方法

  假设有这样一个类,其中包含私有方法。

public class PrivateClass{    private String sayHello(String name)    {        return "Hello: " + name;    }}

  利用反射机制在外部访问该方法: 

import java.lang.reflect.Method;public class TestPrivate{    public static void main(String[] args) throws Exception    {        PrivateClass p = new PrivateClass();        Class
classType = p.getClass(); // 获取Method对象 Method method = classType.getDeclaredMethod("sayHello", new Class[] { String.class }); method.setAccessible(true); // 抑制Java的访问控制检查 // 如果不加上上面这句,将会Error: TestPrivate can not access a member of class PrivateClass with modifiers "private" String str = (String) method.invoke(p, new Object[] { "zhangsan" }); System.out.println(str); }}

 

实例2,访问私有属性

  直接访问私有属性,将例子中的私有属性改值。

  一个包含私有属性的类:

public class PrivateClass2{    private String name = "zhangsan";    public String getName()    {        return name;    }}

  利用反射修改其私有属性的值:  

import java.lang.reflect.Field;public class TestPrivate2{    public static void main(String[] args) throws Exception    {        PrivateClass2 p = new PrivateClass2();        Class
classType = p.getClass(); Field field = classType.getDeclaredField("name"); field.setAccessible(true); // 抑制Java对修饰符的检查 field.set(p, "lisi"); System.out.println(p.getName()); }}

 

 

参考资料:

  AccessibleObject类:

  

  Field:

  

  Method:

  

  Constructor:

  

 

转载地址:http://uqdpx.baihongyu.com/

你可能感兴趣的文章
SVN Hooks的介绍及使用
查看>>
Oracle 字符集的查看和修改【上】
查看>>
tomcat注册windows服务
查看>>
使用qq邮箱的smpt服务发送邮件一定要记得用ssl
查看>>
20个非常有用的Java代码片段
查看>>
网站优化和竞价有什么区别
查看>>
MySQL开源热备工具XtraBackup的原理与程序说明
查看>>
mongoDB(1):windows下安装mongoDB(解压缩版)
查看>>
CentOS修改主机名
查看>>
php 5.3.6中php-fpm 配置
查看>>
XMPP协议分析-原理篇
查看>>
centos7常用操作
查看>>
系统集成资质培训 - 新书发布
查看>>
Ubuntu解决RTNETLINK answers: File exists
查看>>
ES6数组去重的最佳实践:Set结合Array.from() | 拓展运算符结合 Set
查看>>
深入屏幕像素概念
查看>>
awk命令的几个选项注释
查看>>
Windows更改临时文件夹
查看>>
django base (1)
查看>>
iRedMail调整附件大小 & Postfix的bcc(自动转发/邮件备份/监控/归档) 在同一个服务器是有压力...
查看>>