反射调用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中显示格式化的用户输入
Oct 09 PHP
php file_put_contents()功能函数(集成了fopen、fwrite、fclose)
May 24 PHP
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
Jul 18 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
Sep 11 PHP
PHP中使用smarty生成静态文件的例子
Apr 24 PHP
简单谈谈php中ob_flush和flush的区别
Nov 27 PHP
PHP扩展Memcache分布式部署方案
Dec 06 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
Jan 24 PHP
PHP用continue跳过本次循环中剩余代码的注意点
Jun 27 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
Aug 18 PHP
PHP基于cookie实现统计在线人数功能示例
Jan 16 PHP
PHP实现字符串的全排列详解
Apr 24 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
PHP面向对象法则
2012/02/23 PHP
如何用php获取文件名后缀
2013/06/09 PHP
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
2014/01/24 PHP
简单实现php上传文件功能
2017/09/21 PHP
解决tp5在nginx下修改配置访问的问题
2019/10/16 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
javascript实现轮显新闻标题链接
2007/08/13 Javascript
js 三级关联菜单效果实例
2013/08/13 Javascript
如何解决Jquery库及其他库之间的$命名冲突
2013/09/15 Javascript
json实现前后台的相互传值详解
2015/01/05 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
javascript的replace方法结合正则使用实例总结
2016/06/16 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
2016/12/14 Javascript
Vue.js 插件开发详解
2017/03/29 Javascript
JavaScript创建对象的七种方式(推荐)
2017/06/26 Javascript
Mui使用jquery并且使用点击跳转新窗口的实例
2017/08/19 jQuery
vue2.0实现移动端的输入框实时检索更新列表功能
2018/05/08 Javascript
JavaScript设计模式之代理模式实例分析
2019/01/16 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
[04:50]DOTA2亚洲邀请赛小组赛第四日 TOP10精彩集锦
2015/02/02 DOTA
[10:42]Team Liquid Vs Newbee
2018/06/07 DOTA
[53:52]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python 26进制计算实现方法
2015/05/28 Python
python3中rank函数的用法
2019/11/27 Python
python3 求约数的实例
2019/12/05 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
口头翻译求职人自荐信
2013/12/07 职场文书
表彰大会主持词
2014/03/26 职场文书
竞聘自述材料
2014/08/25 职场文书
作风转变年心得体会
2014/10/22 职场文书
学生会个人总结范文
2015/02/15 职场文书