利用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
相关文档:
多线程读写同一个对象的数据是很普遍的,通常,要避免读写冲突,必须保证任何时候仅有一个线程在写入,有线程正在读取的时候,写入操作就必须等待。简单说,就是要避免“写-写”冲突和“读-写”冲突。但是同时读是允许的,因为“读-读”不冲突,而且很安全。
要实现以上的ReadWriteLock, ......
今天继续学习java和android平台 java的学习算是补充,因为没有java基础也做不出什么东西来
今天看到java用this关键字来重载构造方法,在这里做个笔记class a_sample{
public int x,y.z;
a_sample(int x){
this.x=x;
}
a_sample(int x,int y){
this(x);
this.y=y;
}
a_sample(int x ......
java中字符串转换成时间格式总结
关键字: java 字符串 时间 格式
通过长时间的对时间不同格式的转换,自己觉得其实就是对毫秒数的操作
Java代码
System.currentTimeMillis()
System.currentTimeMillis()
得到从1970年1月1日到现在的毫秒数,就可以转换成各种的形式。
有这样一个字符串:“ ......
最近在折腾 PHP + MYSQL
的编程。了解了一些 PHP SQL 注入攻击
的知识,于是写了这篇文章 http://www.xiaohui.com/weekly/20070314.htm,总结一下经验。在我看来,引发 SQL 注入攻击
的主要原因,是因为以下两点原因:
1. php 配置文件 php.ini 中的 magic_quotes_gpc
选项没有打开,被置为 off
2. 开发 ......
级别: 中级
Jack D Herrington
(jherr@pobox.com
), 高级软件工程师, Leverage Software Inc.
2006 年 10 月 19 日
设计模式只是为 Java™ 架构师准备的 —— 至少您可能一直这样认为。实际上,设计模式对于每个人都非常有用。如果这些工具不是 “架构太空人” 的专利,那么它们又是什 ......