反射调用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脚本
Nov 26 PHP
php自动获取目录下的模板的代码
Aug 08 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
Feb 05 PHP
PHP开发框架kohana3 自定义路由设置示例
Jul 14 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
Aug 23 PHP
初识php MVC
Sep 10 PHP
php防止用户重复提交表单
Nov 02 PHP
php的api数据接口书写实例(推荐)
Sep 22 PHP
php实现的生成排列算法示例
Jul 25 PHP
Laravel 自定命令以及生成文件的例子
Oct 23 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
Apr 23 PHP
Yii 框架使用Forms操作详解
May 18 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维护文件系统
2006/10/09 PHP
以文本方式上传二进制文件的PHP程序
2006/10/09 PHP
PHP查看SSL证书信息的方法
2016/09/22 PHP
php防止sql注入的方法详解
2017/02/20 PHP
Yii框架实现记录日志到自定义文件的方法
2017/05/23 PHP
php实现微信支付之退款功能
2018/05/30 PHP
JQuery在页面中添加和除移DOM示例代码
2013/06/24 Javascript
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
禁止ajax缓存获取程序最新数据的方法
2013/11/19 Javascript
js定时器的使用(实例讲解)
2014/01/06 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
2014/07/31 Javascript
node.js中的path.delimiter方法使用说明
2014/12/09 Javascript
js 提交form表单和设置form表单请求路径的实现方法
2016/10/25 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
layui 对弹窗 form表单赋值的实现方法
2019/09/04 Javascript
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
vue和小程序项目中使用iconfont的方法
2020/05/19 Javascript
微信小程序自定义modal弹窗组件的方法详解
2020/12/20 Javascript
python计数排序和基数排序算法实例
2014/04/25 Python
Python ORM框架SQLAlchemy学习笔记之关系映射实例
2014/06/10 Python
编写Python脚本来获取Google搜索结果的示例
2015/05/04 Python
Python数据集切分实例
2018/12/08 Python
Python 学习教程之networkx
2019/04/15 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
Keras中 ImageDataGenerator函数的参数用法
2020/07/03 Python
html5 http的轮询和Websocket原理
2018/10/19 HTML / CSS
注塑工厂厂长岗位职责
2013/12/02 职场文书
残疾人创业典型事迹
2014/02/01 职场文书
法人单位适用的授权委托书
2014/09/19 职场文书
万能检讨书
2015/01/27 职场文书
红色革命电影观后感
2015/06/18 职场文书
如何使用pdb进行Python调试
2021/06/30 Python
java实现自定义时钟并实现走时功能
2022/06/21 Java/Android