反射调用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 特殊字符处理函数
Sep 05 PHP
php mysql Errcode: 28 终极解决方法
Jul 01 PHP
vs中通过剪切板循环来循环粘贴不同内容
Apr 30 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
Aug 08 PHP
整理的一些实用WordPress后台MySQL操作命令
Jan 07 PHP
PHP之uniqid()函数用法
Nov 03 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
Sep 20 PHP
PHP入门教程之操作符与控制结构流程详解
Sep 09 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
Dec 02 PHP
php使用变量动态创建类的对象用法示例
Feb 06 PHP
php实现登录页面的简单实例
Sep 29 PHP
PHP ob缓存以及ob函数原理实例解析
Nov 13 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&amp;&amp;mysql)四
2006/10/09 PHP
PHP通用检测函数集合
2006/11/25 PHP
php 方便水印和缩略图的图形类
2009/05/21 PHP
纯PHP代码实现支付宝批量付款
2015/12/24 PHP
php微信公众号开发之音乐信息
2018/10/20 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
Javascript中Eval函数的使用
2010/03/23 Javascript
javascript实现的使用方向键控制光标在table单元格中切换
2010/11/17 Javascript
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
Javascript获取CSS伪元素属性的实现代码
2014/09/28 Javascript
node+express+jade制作简单网站指南
2014/11/26 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
jQuery插件scroll实现无缝滚动效果
2015/04/27 Javascript
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
jquery easyui如何实现格式化列
2017/07/30 jQuery
JS与jQuery判断文本框还剩多少字符可以输入的方法
2018/09/01 jQuery
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
2018/11/05 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
[49:41]NB vs NAVI Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
跟老齐学Python之做一个小游戏
2014/09/28 Python
python实现简单ftp客户端的方法
2015/06/28 Python
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
Python 读写文件的操作代码
2018/09/20 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
简单了解Django ORM常用字段类型及参数配置
2020/01/07 Python
pytorch进行上采样的种类实例
2020/02/18 Python
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
工程造价专业大专生求职信
2013/10/06 职场文书
物流专业大学应届生求职信
2013/11/03 职场文书
2015新年寄语(一句话)
2014/12/08 职场文书
GoLang中生成UUID唯一标识的实现
2021/05/08 Golang
Java8中接口的新特性使用指南
2021/11/01 Java/Android