反射调用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 相关文章推荐
使用sockets:从新闻组中获取文章(一)
Oct 09 PHP
基于php在各种web服务器的运行模式详解
Jun 03 PHP
使用PHP获取当前url路径的函数以及服务器变量
Jun 29 PHP
PHP5中GD库生成图形验证码(有汉字)
Jul 28 PHP
PHP代码优化之成员变量获取速度对比
Feb 28 PHP
php实现的短网址算法分享
Jun 20 PHP
php中使用array_filter()函数过滤空数组的实现代码
Aug 19 PHP
PHP使用get_headers函数判断远程文件是否存在的方法
Nov 28 PHP
php实现简单的MVC框架实例
Sep 23 PHP
php表单加入Token防止重复提交的方法分析
Oct 10 PHP
php指定长度分割字符串str_split函数用法示例
Jan 30 PHP
PHP sdk实现在线打包代码示例
Dec 09 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
phpfans留言版用到的install.php
2007/01/04 PHP
PHP XML备份Mysql数据库
2009/05/27 PHP
php实现json编码的方法
2015/07/30 PHP
PHP强制转化的形式整理
2020/05/22 PHP
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
兼容IE和Firefox的javascript获取iframe文档内容的函数
2011/08/15 Javascript
js与jQuery 获取父窗、子窗的iframe
2013/12/20 Javascript
javascript调试之DOM断点调试法使用技巧分享
2014/04/15 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
JS实现canvas简单小画板功能
2020/06/23 Javascript
学习python (2)
2006/10/31 Python
关于python pyqt5安装失败问题的解决方法
2017/08/08 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
Python函数定义及传参方式详解(4种)
2019/03/18 Python
PyQt5 对图片进行缩放的实例
2019/06/18 Python
Django后台管理系统的图文使用教学
2020/01/20 Python
tensorflow tf.train.batch之数据批量读取方式
2020/01/20 Python
python 画条形图(柱状图)实例
2020/04/24 Python
C# .NET面试题
2015/11/28 面试题
地理科学专业毕业生求职信
2013/10/15 职场文书
党的群众路线教育实践活动学习心得体会
2014/03/03 职场文书
移风易俗倡议书
2014/04/15 职场文书
我的画教学反思
2014/04/28 职场文书
空气的环保标语
2014/06/12 职场文书
师德师风自查总结
2014/10/14 职场文书
电气工程师岗位职责
2015/02/12 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
党员反四风学习心得体会
2016/01/22 职场文书
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL
Python读写yaml文件
2022/03/20 Python
Oracle使用别名的好处
2022/04/19 Oracle
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server