反射调用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 error_log 函数的使用
Apr 13 PHP
DW中链接mysql数据库时,建立字符集中文出现乱码的解决方法
Mar 27 PHP
PHP查询MySQL大量数据的时候内存占用分析
Jul 22 PHP
PHP fopen 读取带中文URL地址的一点见解
Sep 25 PHP
如何设置mysql允许外网访问
Jun 04 PHP
php根据日期判断星座的函数分享
Feb 13 PHP
ucenter通信原理分析
Jan 09 PHP
PHP简单获取多个checkbox值的方法
Jun 13 PHP
PHP Oauth授权和本地加密实现方法
Aug 12 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
Sep 13 PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 PHP
解决在laravel中auth建立时候遇到的问题
Oct 15 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性能优化的介绍
2013/06/20 PHP
一波PHP中cURL库的常见用法代码示例
2016/05/06 PHP
jQuery创建自己的插件(自定义插件)的方法
2010/06/10 Javascript
分享几个超级震憾的图片特效
2012/01/08 Javascript
js 获取radio按钮值的实例
2013/08/17 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
jQuery前端框架easyui使用Dialog时bug处理
2014/12/05 Javascript
jQuery fancybox在ie浏览器下无法显示关闭按钮的解决办法
2016/02/19 Javascript
全面了解构造函数继承关键apply call
2016/07/26 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
2016/08/09 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
2016/11/03 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
2019/08/20 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
2019/12/30 jQuery
Vue项目打包编译优化方案
2020/09/16 Javascript
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
python并发编程之多进程、多线程、异步和协程详解
2016/10/28 Python
python中的break、continue、exit()、pass全面解析
2017/08/05 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
python使用opencv对图像mask处理的方法
2019/07/05 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
简单介绍一下pyinstaller打包以及安全性的实现
2020/06/02 Python
Python函数参数定义及传递方式解析
2020/06/10 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
Pycharm 解决自动格式化冲突的设置操作
2021/01/15 Python
社区庆八一活动方案
2014/02/02 职场文书
党员干部承诺书
2014/03/25 职场文书
党员个人剖析材料
2014/09/30 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
python 下载文件的几种方式分享
2021/04/07 Python
Nginx源码编译安装过程记录
2021/11/17 Servers