当前位置: 移动技术网 > IT编程>开发语言>PHP > 反射调用private方法实践(php、java)

反射调用private方法实践(php、java)

2018年04月21日  | 移动技术网IT编程  | 我要评论

单测中有个普遍性的问题,被侧类中的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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网