行业知识
Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?
前言
在 Java 中如果我们使用 new 关键字调用构造函数对类进行实例化,我们就可以根据在这个类中的修饰符来访问类中定义的非私有方法。但是如果需要在其他类调用私有的方法,就可以利用 Java 中提供的反射来实现。
一、私有方法在本类中直接调用
1.1、在本类中实例化,调用私有方法
说明:被 private 关键字修饰的构造方法、方法或者数据域只在其所在的类中可见。
如下,我们创建一个 Demo 类,并定义一个私有的方法 demo(),使用 main 函数在本类中使用 new 关键字实例化类,去调用 demo() 方法,运行成功输出结果,代码如下:
package com.bailu.demo;public class Demo {private void demo() {System.out.println("私有方法!");}// 私有方法只有在本类中可以访问public static void main(String[] args) {Demo demo = new Demo();demo.demo();}} 1.2、尝试在其他类直接调用私有方法(错误示范)
如果我们直接在其他的类中实例化 Demo 类,来直接调用 demo() 方法,就会发现 IDE 直接产生编译错误,很明显我们直接在另一个类中调用私有方法是行不通的,IDE 提示我们把 private 修饰符去掉,这又是不满足我们需求的,如下图所示:
二、使用反射实例化类强制调用私有方法
2.1、使用类加载器加载被调用的类
Class cls = Class.forName("com.bailu.demo.Demo"); 说明:这里的Class 即为 Java 中的泛型。以下是我们在开发中常见的几种泛型:
- ? 表示不确定的 Java 类型
- T 表示 Java 类型
- K V 分别代表 Java 键值中的 Key Value
- E 代表 Element
2.2、使用 Object 类对获取的类进行实例化
Object obj = cls.newInstance();
说明:Object是所有类的根类,是具体的一个类,使用的时候可能需要类型强制转换的,但是用通配符 ?、T 、K 、V、 E 等这些的话,在实际用之前类型就已经确定了,不需要强制转换。
2.3、调用 Java 反射中的 Method 类
Method method = cls.getDeclaredMethod("demo", null);说明:Method类是java.lang.reflect中提供的一个类。我们通过实例化Method类来调用Method类中的方法,常用方法有以下几个:
- getMethods():获得类的 public 类型的方法
- getMethod(String name, Class[] params):获得类的特定方法,name 参数指定方法的名字,params 参数指定方法的参数类型
- getDeclaredMethods():获取类中所有的方法(public、protected、default、private)
- getDeclaredMethod(String name, Class[] params):获得类的特定方法,name 参数指定方法的名字,params 参数指定方法的参数类型
这里我们调用第四个获取 Demo 类的 demo() 方法,参数类型为 null。
2.4、取消 Java 语言的访问检查
method.setAccessible(true);
setAccessible(true/false):表示禁用和启用安全检查的开关。
说明:当值为true时,指反射对象在使用时应该取消 Java 语言访问检查,值为false则只是反射的对象应该试试 Java 语言访问检查。当值设置为true时,不接受检查,可以提高反射的运行速度。
2.5、使用 method 方法返回对象
使用 method.invoke(Object obj,Object args[]);返回对象,强制执行对象中的目标方法,代码如下:
method.invoke(obj, null);
说明:Method类的invoke(Object obj,Object args[])方法接收的参数必须为对象,如果参数为基本类型数据,必须转换为相应的包装类型的对象。invoke()方法的返回值总是对象,如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,再将其返回。
三、完整实现代码、运行结果
Demo 类:
package com.bailu.demo;public class Demo {private void demo() {System.out.println("私有方法!");}# 分享**1、算法大厂——字节跳动面试题****2、2000页互联网Java面试题大全****3、高阶必备,算法学习**链图片转存中...(img-mbPJVr07-1714312237408)]**2、2000页互联网Java面试题大全**[外链图片转存中...(img-fyUsXfJL-1714312237408)]**3、高阶必备,算法学习**[外链图片转存中...(img-h7cIvkfL-1714312237408)]> **本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录**
上一篇:怎么查看服务器的模组配置?
下一篇:大龄求职不是问题,原因是什么?
最新文章
- 微信淘客系统源码揭秘,助力淘客事业飞跃发展的终极解决方案!
- 本人22岁,刚从亲戚那辞职不久,在家待了一个多月了。每日浑浑噩噩的过着,可以说,和各位同僚一样,“迷茫”两个字能代表我现在的心情,一想到,文凭没什么文凭,证书没证书,社会经验可以说严重不足。想到以后,我满脑子的感叹号!。哎,好好活着真难……
- 面了 6 家大厂,并拿下 5 家 offer,进大厂好像也没有那么困难吧....
- 短信群发平台代理,开启财富之门的无限商机
- DZ论坛宽屏设置指南,轻松掌握论坛布局调整技巧!
- PHP源码深度解析与微信企业号开发实战秘籍
- 检测不到网页备案怎么办呢
- 网站要怎么备案?
- 精选油烟机指南,如何轻松挑选最佳型号?
- 曲周下载攻略,轻松获取资源,一网打尽!