反射调用private方法实践(php、java)
程序员文章站
2022-03-09 22:09:56
单测中有个普遍性的问题,被侧类中的private方法无法直接调用。小拽在处理过程中通过反射改变方法权限,进行单测,分享一下,直接上代码。
简单被测试类
生成一个...
单测中有个普遍性的问题,被侧类中的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
上一篇: C++内存(内存池)管理讲解