反射调用private方法实践(php、java)
网络编程 2021-07-05 09:09www.168986.cn编程入门
这篇文章主要介绍了反射调用private方法实践(php、java)的相关资料,需要的朋友可以参考下
单测中有个普遍性的问题,被侧类中的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 suess";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 work 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->setAessible(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('/suess/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->setAessible(true);return $method;}
狼蚁网站SEO优化给大家分享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.setAessible(true); method.invoke(new PackageClazz(), "452345234","q31234132"); } } class PackageClazz { private void privilegedMethod(String invokerName,String adb) { System.out.println("---"+invokerName+"----"+adb); } }</span>
输出结果为---452345234----q31234132
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程