反射调用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 相关文章推荐
第十三节 对象串行化 [13]
Oct 09 PHP
php header示例代码(推荐)
Sep 08 PHP
浅析ThinkPHP中的pathinfo模式和URL重写
Jan 06 PHP
PHP获取时间排除周六、周日的两个方法
Jun 30 PHP
CI(Codeigniter)的Setting增强配置类实例
Jan 06 PHP
php采集神器cURL使用方法详解
Feb 19 PHP
PHP设计模式之简单投诉页面实例
Feb 24 PHP
PHP获取数组中单列值的方法
Jun 10 PHP
PHP实现的随机红包算法示例
Aug 14 PHP
swoole和websocket简单聊天室开发
Nov 18 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 27 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 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/11/07 PHP
smarty缓存用法分析
2014/12/16 PHP
php+ajax实时输入自动搜索匹配的方法
2014/12/26 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
PHP应用跨时区功能的实现方法
2019/03/21 PHP
PHP之header函数详解
2021/03/02 PHP
通过Unicode转义序列来加密,按你说的可以算是混淆吧
2007/05/06 Javascript
javascript中万恶的function实例分析
2011/05/25 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
利用原生JS与jQuery实现数字线性变化的动画
2017/02/24 Javascript
JSON对象转化为字符串详解
2017/08/11 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
Node.js实现注册邮箱激活功能的方法示例
2018/03/23 Javascript
使用layui 渲染table数据表格的实例代码
2018/08/19 Javascript
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
Vue跨域请求问题解决方案过程解析
2020/08/07 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
深入浅出分析Python装饰器用法
2017/07/28 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
2017/12/21 Python
python traceback捕获并打印异常的方法
2018/08/31 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
Python如何访问字符串中的值
2020/02/09 Python
Windows下Anaconda和PyCharm的安装与使用详解
2020/04/23 Python
python调用win32接口进行截图的示例
2020/11/11 Python
如何向scrapy中的spider传递参数的几种方法
2020/11/18 Python
乌克兰移动电子产品和相关配件的在线商店:iTMag
2020/03/16 全球购物
通信工程毕业生求职信
2013/11/16 职场文书
自荐信格式写作方法有哪些呢
2013/11/20 职场文书
师德学习感言
2014/01/31 职场文书
中式婚礼主持词
2014/03/13 职场文书
幼儿园小班评语大全
2014/04/17 职场文书
政府班子四风问题整改措施思想汇报
2014/10/08 职场文书
乡镇务虚会发言材料
2014/10/20 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
vue router 动态路由清除方式
2022/05/25 Vue.js