反射调用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 相关文章推荐
风格模板初级不完全修改教程
Oct 09 PHP
php addslashes 函数详细分析说明
Jun 23 PHP
深入php处理整数函数的详解
Jun 09 PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
Jun 21 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
Jun 29 PHP
PHP版微信公众平台红包API
Apr 02 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
Apr 15 PHP
PHP处理postfix邮件内容的方法
Jun 16 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
Apr 25 PHP
php字符串函数 str类常见用法示例
May 15 PHP
php生成短网址/短链接原理和用法实例分析
May 29 PHP
PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解
Jun 05 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实现生成唯一编号(36进制的不重复编号)
2014/07/01 PHP
php生成验证码函数
2015/10/20 PHP
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
2016/08/17 PHP
php简单处理XML数据的方法示例
2017/05/19 PHP
jquery1.4后 jqDrag 拖动 不可用
2010/02/06 Javascript
TextArea不支持maxlength的解决办法(jquery)
2011/09/13 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
javascript的事件触发器介绍的实现
2014/06/05 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
2016/08/04 Javascript
DWR3 访问WEB元素的两种方法实例详解
2017/01/03 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
2019/01/30 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
python中实现延时回调普通函数示例代码
2017/09/08 Python
神经网络(BP)算法Python实现及应用
2018/04/16 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
Django框架orM与自定义SQL语句混合事务控制操作
2019/06/27 Python
python实现拼图小游戏
2020/02/22 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
2020/04/17 Python
详解Python的爬虫框架 Scrapy
2020/08/03 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
PHP面试题-$message和$$message的区别
2015/12/08 面试题
C#里面如何判断一个Object是否是某种类型(如Boolean)?
2016/02/10 面试题
学院书画协会部门职责
2013/11/28 职场文书
教育专业个人求职信
2013/12/02 职场文书
《云雀的心愿》教学反思
2014/02/25 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
2015年超市工作总结范文
2015/05/26 职场文书
感谢信的技巧及范例
2019/05/15 职场文书
Idea连接MySQL数据库出现中文乱码的问题
2021/04/14 MySQL
自动在Windows中运行Python脚本并定时触发功能实现
2021/09/04 Python