反射调用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 杂谈《重构-改善既有代码的设计》之三 重新组织数据
Apr 09 PHP
如何修改和添加Apache的默认站点目录
Jul 05 PHP
请离开include_once和require_once
Jul 18 PHP
PHP实现删除非站内外部链接实例代码
Jun 17 PHP
PHP JSON格式的中文显示问题解决方法
Apr 09 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
Jan 07 PHP
PHP 根据key 给二维数组分组
Dec 09 PHP
PHP递归实现快速排序的方法示例
Dec 18 PHP
php文件操作之文件写入字符串、数组的方法分析
Apr 15 PHP
php设计模式之适配器模式原理、用法及注意事项详解
Sep 24 PHP
php 实现银联商务H5支付的示例代码
Oct 12 PHP
php操作redis数据库常见方法实例总结
Feb 20 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
4.与数据库的连接
2006/10/09 PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
2014/02/13 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
PHP中Session ID的实现原理实例分析
2019/08/17 PHP
javascript学习笔记(七) js函数介绍
2012/06/19 Javascript
javascript 实现子父窗体互相传值的简单实例
2014/02/17 Javascript
鼠标移到图片上变大显示而不是放大镜效果
2014/06/15 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
浅析JS获取url中的参数实例代码
2016/06/14 Javascript
Bootstrap时间选择器datetimepicker和daterangepicker使用实例解析
2016/09/17 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
2016/12/26 Javascript
学习使用jQuery表单验证插件和日历插件
2017/02/13 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
python中日期和时间格式化输出的方法小结
2015/03/19 Python
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
Python实现快速排序和插入排序算法及自定义排序的示例
2016/02/16 Python
Python 专题一 函数的基础知识
2017/03/16 Python
新建文件时Pycharm中自动设置头部模板信息的方法
2020/04/17 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
详解CSS3 用border写 空心三角箭头 (两种写法)
2017/09/29 HTML / CSS
HTML5的自定义属性data-*详细介绍和JS操作实例
2014/04/10 HTML / CSS
Nicole Miller官方网站:纽约女装品牌
2019/09/14 全球购物
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
PHP面试题及答案二
2015/05/23 面试题
杭州-DOTNET笔试题集
2013/09/25 面试题
JSP&Servlet技术面试题
2015/05/21 面试题
大一新生军训时的自我评价分享
2013/12/05 职场文书
期末考试动员演讲稿
2014/01/10 职场文书
村道德模范事迹材料
2014/08/28 职场文书
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
golang 比较浮点数的大小方式
2021/05/02 Golang