反射调用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 过滤英文标点符号及过滤中文标点符号代码
Jun 12 PHP
PHP中require和include路径问题详解
Dec 25 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
Apr 27 PHP
php简单实现屏蔽指定ip段用户的访问
Apr 29 PHP
[原创]PHP字符串中插入子字符串方法总结
May 06 PHP
程序员的表白神器“520”大声喊出来
May 20 PHP
php中strtotime函数性能分析
Nov 20 PHP
CI框架实现优化文件上传及多文件上传的方法
Jan 04 PHP
thinkphp Apache配置重启Apache1 restart 出错解决办法
Feb 15 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
Jan 15 PHP
php使用scandir()函数扫描指定目录下所有文件示例
Jun 08 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
May 25 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
php2html php生成静态页函数
2008/12/08 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
2015/12/07 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
CakePHP框架Model函数定义方法示例
2017/08/04 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
2019/02/15 PHP
javascript 写类方式之二
2009/07/05 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
nodejs文件操作模块FS(File System)常用函数简明总结
2014/06/05 NodeJs
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
Ajax分页插件Pagination从前台jQuery到后端java总结
2016/07/22 Javascript
jQuery仿京东商城楼梯式导航定位菜单
2016/07/25 Javascript
微信小程序开发教程-手势解锁实例
2017/01/06 Javascript
BootStrapValidator初使用教程详解
2017/02/10 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
python Django连接MySQL数据库做增删改查
2013/11/07 Python
python抓取网页内容示例分享
2014/02/24 Python
python入门前的第一课 python怎样入门
2018/03/06 Python
Python 使用PIL numpy 实现拼接图片的示例
2018/05/08 Python
python中pip的安装与使用教程
2018/08/10 Python
python实现简单flappy bird
2018/12/24 Python
Python检查 云备份进程是否正常运行代码实例
2019/08/22 Python
python编程的核心知识点总结
2021/02/08 Python
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
沙特阿拉伯排名第一的在线时尚购物应用程序:1Zillion
2020/08/08 全球购物
研究生自我鉴定范文
2013/10/30 职场文书
幼儿园课题方案
2014/06/09 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
活动费用申请报告
2015/05/15 职场文书
2016春季幼儿园小班开学寄语
2015/12/03 职场文书
2019个人工作计划书的格式及范文!
2019/07/04 职场文书
mysql数据库入门第一步之创建表
2021/05/14 MySQL
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电