反射调用private方法实践(php、java)


Posted in PHP onDecember 21, 2015

单测中有个普遍性的问题,被侧类中的private方法无法直接调用。小拽在处理过程中通过反射改变方法权限,进行单测,分享一下,直接上代码。

简单被测试类

生成一个简单的被测试类,只有个private方法。

<?php/** * 崔小涣单测的基本模板。 * * @author cuihuan * @date 2015/11/12 22:15:31 * @version $Revision:1.0$ **/class MyClass {/** * 私有方法 * * @param $params * @return bool */private function privateFunc($params){if(!isset($params)){return false;}echo "test success";return $params;}}

单测代码

<?php/*************************************************************************** * * $Id: MyClassTest T,v 1.0 PsCaseTest cuihuan Exp$ * **************************************************************************//** * 崔小涣单测的基本模板。 * * @author cuihuan * @date 2015/11/12 22:09:31 * @version $Revision:1.0$ **/require_once ('./MyClass.php');class MyClassTest extends PHPUnit_Framework_TestCase {const CLASS_NAME = 'MyClass';const FAIL  = 'fail';protected $objMyClass;/** * @brief setup: Sets up the fixture, for example, opens a network connection. * * 可以看做phpunit的构造函数 */public function setup() {date_default_timezone_set('PRC');$this->objMyClass = new MyClass();}/** * 利用反射,对类中的private 和 protect 方法进行单元测试 * * @param $strMethodName string :反射函数名 * @return ReflectionMethod obj  :回调对象 */protected static function getPrivateMethod($strMethodName) {$objReflectClass = new ReflectionClass(self::CLASS_NAME);$method = $objReflectClass->getMethod($strMethodName);$method->setAccessible(true);return $method;}/** * @brief :测试private函数的调用 */public function testPrivateFunc(){$testCase = 'just a test string';// 反射该类$testFunc = self::getPrivateMethod('privateFunc');$res = $testFunc->invokeArgs($this->objMyClass, array($testCase));$this->assertEquals($testCase, $res);$this->expectOutputRegex('/success/i');// 捕获没有参数异常测试try { $testFunc->invokeArgs($this->transfer2Pscase, array());} catch (Exception $expected) {$this->assertNotNull($expected);return true;}$this->fail(self::FAIL);}}

运行结果

cuihuan:test cuixiaohuan$ phpunit MyClassTest.php PHPUnit 4.8.6 by Sebastian Bergmann and contributors.Time: 103 ms, Memory: 11.75MbOK (1 test, 3 assertions)

关键代码分析

封装了一个,被测类方法的反射调用;同时,返回方法之前处理方法的接入权限为true,便可以访问private的函数方法。

/** * 利用反射,对类中的private 和 protect 方法进行单元测试 * * @param $strMethodName string :反射函数名 * @return ReflectionMethod obj  :回调对象 */protected static function getPrivateMethod($strMethodName) {$objReflectClass = new ReflectionClass(self::CLASS_NAME);$method = $objReflectClass->getMethod($strMethodName);$method->setAccessible(true);return $method;}

下面给大家分享java中利用反射调用另一类的private方法

我们知道,Java应用程序不能访问持久化类的private方法,但Hibernate没有这个限制,它能够访问各种级别的方法,如private, default, protected, public. Hibernate是如何实现该功能的呢?答案是利用JAVA的反射机制,如下: 

<span style="font-size:14px;">import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 
public class ReflectDemo { 
 public static void main(String[] args) throws Exception { 
  Method method = PackageClazz.class.getDeclaredMethod("privilegedMethod", new Class[]{String.class,String.class});  
  method.setAccessible(true); 
  method.invoke(new PackageClazz(), "452345234","q31234132"); 
 } 
} 
class PackageClazz { 
 private void privilegedMethod(String invokerName,String adb) { 
  System.out.println("---"+invokerName+"----"+adb); 
 } 
}</span>

输出结果为:---452345234----q31234132

PHP 相关文章推荐
PHP目录函数实现创建、读取目录教程实例
Jan 13 PHP
destoon实现调用自增数字从1开始的方法
Aug 21 PHP
五款PHP代码重构工具推荐
Oct 14 PHP
php命令行用法入门实例教程
Oct 27 PHP
部署PHP时的4个配置修改说明
Oct 19 PHP
YII Framework框架教程之国际化实现方法
Mar 14 PHP
php gd等比例缩放压缩图片函数
Jun 12 PHP
php实现学生管理系统
Mar 21 PHP
php判断是否为ajax请求的方法
Nov 29 PHP
PHP的简单跳转提示的实现详解
Mar 14 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
Jul 09 PHP
PHP二维数组分页2种实现方法解析
Jul 09 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
Dec 21 #PHP
变量在 PHP7 内部的实现(二)
Dec 21 #PHP
变量在 PHP7 内部的实现(一)
Dec 21 #PHP
php阿拉伯数字转中文人民币大写
Dec 21 #PHP
详解PHP执行定时任务的实现思路
Dec 21 #PHP
PHP定时执行任务的3种方法详解
Dec 21 #PHP
详解PHP实现执行定时任务
Dec 21 #PHP
You might like
php5.5中类级别的常量使用介绍
2013/10/02 PHP
ThinkPHP分页实例
2014/10/15 PHP
微信公众平台开发之天气预报功能
2015/08/31 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
php简单解析mysqli查询结果的方法(2种方法)
2016/06/29 PHP
JS自动适应的图片弹窗实例
2013/06/29 Javascript
采用call方式实现js继承
2014/05/20 Javascript
jquery ezUI 双击行记录弹窗查看明细的实现方法
2016/06/01 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
2016/08/26 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
概述jQuery中的ajax方法
2016/12/16 Javascript
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
js实现无缝轮播图特效
2020/05/09 Javascript
javascript中闭包closure的深入讲解
2021/03/03 Javascript
python开发的小球完全弹性碰撞游戏代码
2013/10/15 Python
Python3基础之输入和输出实例分析
2014/08/18 Python
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
python基础知识小结之集合
2015/11/25 Python
python实现自主查询实时天气
2018/06/22 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
Numpy将二维数组添加到空数组的实现
2019/12/05 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
HTML5页面嵌入小程序没有返回按钮及返回页面空白的问题
2020/05/28 HTML / CSS
美国高档百货Nordstrom的折扣店:Nordstrom Rack
2017/11/13 全球购物
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
妇产科护士自我鉴定
2013/10/15 职场文书
房地产销售员的自我评价分享
2013/12/04 职场文书
幼儿园春游活动方案
2014/01/19 职场文书
人力资源管理专业自荐书范文
2014/02/10 职场文书
银行授权委托书格式
2014/10/10 职场文书
本溪水洞导游词
2015/02/11 职场文书
高中班主任心得体会
2016/01/07 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python