您的位置:首页 > 编程语言 > Java开发

通过使用java.lang.reflect.Proxy实现动态代理

2014-04-19 19:22 1026 查看
/**
*  2014-4-19
*  动态代理比代理的思想更进一步,可以动态地创建代理,并且可以动态地调用被代理的方法。
*
*/
package typeinfo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
* 定义出代理对象的接口
* @author LYL
*
*/
interface Interface{
void doSomething();
void somethingElse(String arg);
}

/**
* 被代理的对象,是真正干活的
* @author LYL
*
*/
class RealObject implements Interface{

@Override
public void doSomething() {
System.out.println("RealObject doSomething");
}

@Override
public void somethingElse(String arg) {
System.out.println("RealObject somethingElse"+arg);
}
}
/**
* 定义代理类调用被代理类的方法时的逻辑
* @author LYL
*
*/
class ProxyHandler implements InvocationHandler
{
//被代理对象
private Interface proxied;
public ProxyHandler(Interface proxied){
this.proxied=proxied;
}
/**
* 调用处理器,当动态代理进行方法调用时,将使用该处理器。
* 可以在该方法中对指定的方法进行定制,特殊处理。
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("Proxy:"+proxy.getClass()+", method:"+method+" , args:"+args);
//显示参数
if(args!=null){
for(Object arg:args){
System.out.println("   "+arg);
}
}
//调用被代理类的方法
return method.invoke(this.proxied, args);
}
}

/**
* 通过使用java.lang.reflect.Proxy创建动态代理的实例
* @author LYL
*
*/
public class SimpleDynamicProxy{
public static void consumer(Interface iface){
iface.doSomething();
iface.somethingElse(" invoke ");
}

public static void main(String args[]) throws Exception{
RealObject real=new RealObject();
//对象的一般调用
consumer(real);

//创建一个动态代理
Interface iface=(Interface)Proxy.newProxyInstance(
//类加载器,
Interface.class.getClassLoader(),
//代理类实现的接口或基类数组
new Class[]{Interface.class},
//代理处理器
new ProxyHandler(new RealObject()));

System.out.println("通过动态代理生成的代理类实例");
//通过生成的动态代理来执行功能
consumer(iface);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐