反射调用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
如何将一个表单同时提交到两个地方处理
Oct 09 PHP
PHP Memcached + APC + 文件缓存封装实现代码
Mar 11 PHP
ubuntu 编译安装php 5.3.3+memcache的方法
Aug 05 PHP
PHP $_FILES函数详解
Mar 09 PHP
PHP框架Swoole定时器Timer特性分析
Aug 19 PHP
9段PHP实用功能的代码推荐
Oct 14 PHP
YII Framework框架教程之日志用法详解
Mar 14 PHP
Yii2框架使用计划任务的方法
May 25 PHP
php cookie 详解使用实例
Nov 03 PHP
thinkPHP中验证码的简单实现方法
Dec 05 PHP
php显示页码分页类的封装
Jun 08 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 防止单引号,双引号在接受页面转义
2008/07/10 PHP
PHP Class&amp;Object -- PHP 自排序二叉树的深入解析
2013/06/25 PHP
PHP 正则表达式小结
2015/02/12 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
IE事件对象(The Internet Explorer Event Object)
2012/06/27 Javascript
js操作模态窗口及父子窗口间相互传值示例
2014/06/09 Javascript
JavaScript闭包详解
2015/02/02 Javascript
BootStrap中Tab页签切换实例代码
2016/05/30 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
2016/12/23 Javascript
Bootstrap导航条学习使用(一)
2017/02/08 Javascript
Bootstrap Table 删除和批量删除
2017/09/22 Javascript
微信小程序使用progress组件实现显示进度功能【附源码下载】
2017/12/12 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
2018/08/22 Javascript
JS实现json数组排序操作实例分析
2019/10/28 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
详解Webpack抽离第三方类库以及common解决方案
2020/03/30 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
详解vue中在父组件点击按钮触发子组件的事件
2020/11/13 Javascript
Python给你的头像加上圣诞帽
2018/01/04 Python
浅析Python3爬虫登录模拟
2018/02/07 Python
python PyTorch预训练示例
2018/02/11 Python
python实现狄克斯特拉算法
2019/01/17 Python
python读写csv文件并增加行列的实例代码
2019/08/01 Python
django ManyToManyField多对多关系的实例详解
2019/08/09 Python
python 魔法函数实例及解析
2019/09/25 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
日本最大化妆品和美容产品的综合口碑网站:cosme shopping
2019/08/28 全球购物
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
前台接待岗位职责范本
2015/04/03 职场文书
军训通讯稿范文
2015/07/18 职场文书
导游词之镇江西津古渡
2019/11/06 职场文书
python面向对象版学生信息管理系统
2021/06/24 Python
java解析XML详解
2021/07/09 Java/Android