欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

反射调用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