反射调用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.MVC的模板标签系统(二)
Sep 05 PHP
php下一个阿拉伯数字转中文数字的函数
Jul 16 PHP
php读取30天之内的根据算法排序的代码
Apr 06 PHP
PHP中将字符串转化为整数(int) intval() printf() 性能测试
Mar 20 PHP
探讨php中防止SQL注入最好的方法是什么
Jun 10 PHP
thinkphp使用phpmailer发送邮件的方法
Nov 24 PHP
php连接odbc数据源并保存与查询数据的方法
Dec 24 PHP
php中JSON的使用方法
Apr 30 PHP
PHP实现动态web服务器方法
Jul 29 PHP
golang与php实现计算两个经纬度之间距离的方法
Jul 22 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
Dec 19 PHP
PHP中引用类型和值类型功能与用法示例
Feb 26 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中的Memcache详解
2014/04/05 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
PHP中Session ID的实现原理实例分析
2019/08/17 PHP
基于laravel-admin 后台 列表标签背景的使用方法
2019/10/03 PHP
自动设置iframe大小的jQuery代码
2013/09/11 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
Vue.js中用v-bind绑定class的注意事项
2016/12/13 Javascript
JS作用域链详解
2017/06/26 Javascript
浅谈原型对象的常用开发模式
2017/07/22 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
jQuery中库的引用方法
2018/01/06 jQuery
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
[40:03]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#1EHOME VS Archon
2016/03/02 DOTA
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
python连接sql server乱码的解决方法
2013/01/28 Python
Python加pyGame实现的简单拼图游戏实例
2015/05/15 Python
django rest framework之请求与响应(详解)
2017/11/06 Python
使用sklearn之LabelEncoder将Label标准化的方法
2018/07/11 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
2020/01/10 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
Django用户认证系统如何实现自定义
2020/11/12 Python
python音频处理的示例详解
2020/12/23 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
教你怎样写好自我评价
2013/10/05 职场文书
医药代表个人求职信范本
2013/12/19 职场文书
关于环保的建议书400字
2014/03/12 职场文书
《猴子种果树》教学反思
2014/04/26 职场文书
企业承诺书格式
2014/05/21 职场文书
部门活动策划方案
2014/08/16 职场文书
公司收款委托书范本
2014/09/20 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
班主任工作总结范文
2015/08/13 职场文书
浅谈JS的原型和原型链
2021/06/04 Javascript
pandas中对文本类型数据的处理小结
2021/11/01 Python