易截截图软件、单文件、免安装、纯绿色、仅160KB

利用php中的eval来模拟java中的动态代理

使用java中的动态代理可以完成很多事情,比如将业务实例进行托管,实现AOP等,但是Php中没有实现这样的东西,昨天突然想到其实可以通过eval来模拟一个动态代理机制。php比java不同的是,php是不需要编译的,因此只要我们能够动态生成一段代码,然后用eval来执行就可以达到效果。代码如下:
/**
* 代理实现类
*/
interface IInvocationHandler
{
function invoke($method, array $arr_args);
}
/**
* 代理类
*/
final class Proxy
{
const CLASS_TEMPLATE = '
final class %s implements %s
{
private $handler;
public function __construct(IInvocationHandler $handler)
{
$this->handler = $handler;
}
%s
}
';
const FUNCTION_TEMPLATE = '
public function %s(%s)
{
$arr_args = func_get_args ();
$arr_method = explode("::", __METHOD__);
$this->handler->invoke ( $arr_method[1], $arr_args );
}
';
public static function newProxyInstance(array $arr_interface, IInvocationHandler $handler)
{
$className = self::getClassName ( $arr_interface );
if (class_exists ( $className ))
{
return new $className ( $handler );
}
self::checkInterfaceExists ( $arr_interface );
self::generateClass ( $arr_interface );
return new $className ( $handler );
}
protected static function generateClass(array $arr_interface)
{
$className = self::getClassName ( $arr_interface );
$interfaceList = implode ( ',', $arr_interface );
$functionList = '';
foreach ( $arr_interface as $interface )
{
$class = new ReflectionClass ( $interface );
$arr_method = $class->getMethods ();
foreach ( $arr_method as $method )
{
$methodName = $method->getName ();
$arr_parameter = $method->getParameters ();
$parameterArray = array ();
foreach ( $arr_parameter as $parameter )
{
$parameterName = $parameter->getName ();
$parameterArray [] = '$' . $parameterName;
}
$parameterList = implode ( ',', $parameterArray );
}
$functionList .= sprintf ( self::FUNCTION_TEMPLATE, $methodN


相关文档:

java的类加载机制

Java 语言是一种具有动态性的解释型编程语言,当指定程序运行的时候, Java 虚拟机就将编译生成的 . class 文件按照需求和一定的规则加载进内存,并组织成为一个完整的 Java 应用程序。 Java 语言把每个单独的类 Class 和接口 Implements 编译成单独的一个 . class 文件,这些文件对于 Java 运行环境来说就是一个个可以动态 ......

Java二分法

贴段代码,有少许注释:
package ibees;
import java.util.Arrays;
public class BinarySearch {

/**
* @param args
*/
public static void main(String[] args) {
double[] src = new double[]{1.3,9.9,10.89,12.89,89.0};
System.out.println(new BinarySearch().binarySearch(src, 89.0));
}

......

java性能监控工具 btrace

btrace是sun推出的一款java性能监控工具,利用java agent 和 jvm attach技术,可以不停机的情况下监控线上情况,并且做到最少的侵入,占用最少的系统资源。
详细见官方文档
另外btrace有很严格的限制,比如拼接字符串、循环、递归、以及我们平时经常用的一些方法都不可以用,他有他自己专门的类库。
btrace还提供了Vi ......

五种常见的 PHP 设计模式


级别: 中级
Jack D Herrington
(jherr@pobox.com
), 高级软件工程师, Leverage Software Inc.
2006 年 10 月 19 日
设计模式只是为 Java™ 架构师准备的 —— 至少您可能一直这样认为。实际上,设计模式对于每个人都非常有用。如果这些工具不是 “架构太空人” 的专利,那么它们又是什 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号