反射调用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 相关文章推荐
paypal即时到账php实现代码
Nov 28 PHP
记录mysql性能查询过程的使用方法
May 02 PHP
PHP中常用的输出函数总结
Sep 22 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
May 12 PHP
php根据日期或时间戳获取星座信息和生肖等信息
Oct 20 PHP
ZF框架实现发送邮件的方法
Dec 03 PHP
YII Framework框架教程之缓存用法详解
Mar 14 PHP
php 一维数组的循环遍历实现代码
Apr 10 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
May 11 PHP
基于laravel where的高级使用方法
Oct 10 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
Jun 06 PHP
如何在PHP环境中使用ProtoBuf数据格式
Jun 19 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
上传文件先创建目录 再上传到目录里面去
2010/12/29 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
php 数组元素快速去重
2017/05/05 PHP
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
PHP7 list() 函数修改
2021/03/09 PHP
jQuery的一些注意
2006/12/06 Javascript
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
2013/07/17 Javascript
实测jquery data()如何存值
2013/08/18 Javascript
js实现连个数字相加而不是拼接的方法
2014/02/23 Javascript
javascript 对象数组根据对象object key的值排序
2015/03/09 Javascript
jQuery实例—选项卡的简单实现(js源码和jQuery)
2016/06/14 Javascript
js 动态生成html 触发事件传参字符转义的实例
2017/02/14 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
浅谈vue路径优化之resolve
2017/10/13 Javascript
利用vue-i18n实现多语言切换效果的方法
2019/06/19 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
2019/08/02 Javascript
layui内置模块layim发送图片添加加载动画的方法
2019/09/23 Javascript
简单介绍Python中的RSS处理
2015/04/13 Python
使用python实现个性化词云的方法
2017/06/16 Python
Python 类属性与实例属性,类对象与实例对象用法分析
2019/09/20 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
Max&Co官网:意大利年轻女性时尚品牌
2017/05/16 全球购物
Speedo速比涛法国官方网站:泳衣、泳镜、泳帽、泳裤
2019/07/30 全球购物
公务员诚信承诺书
2014/05/26 职场文书
文明城市标语
2014/06/16 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
司考复习计划
2015/01/19 职场文书
2015年计划生育协会工作总结
2015/05/13 职场文书
竞聘演讲报告:基本写作有哪些?附开头范文
2019/10/16 职场文书
详解TS数字分隔符和更严格的类属性检查
2021/05/06 Javascript