码迷,mamicode.com
首页 > 其他好文 > 详细

动态代理

时间:2016-12-21 16:14:04      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:win   system   zed   invoke   his   ble   print   cti   throws   

 

public interface HelloWorld
{

void sayHello(String name);

}

public HelloWorldImpl implements HelloWorld
{

@Override
public void sayHello(String name)
{
System.out.println("Hello " + name);
}

}

实现java的动态代理接口

public class CustomInvocationHandler implements InvocationHandler
{

private Object target;

public CustomInvocationHandler(Object target)
{

this.target = target;

}

@Override
public Object invoke(Object proxy,Method method,Object[] args)throw Throwable
{

Object retVal = method.invoke(target,args);

return retVal;

}

}


使用代理类

public class ProxyTest
{

public static void main(String[] args) throws Exception
{

InvocationHandler handler = new CustomInvocationHandler(new HelloWorldImpl());

HelloWorld proxy = (HelloWorld)Proxy.newProxyInstance(
ProxyTest.class.getClassLoder(),new Class[]{HelloWorld.class},handler);
proxy.sayHello("你好");
)

}

}
=====================================
public class Proxy
{

private static Map loaderToCache = new WeakHashMap();

private static Object pendingGenerationMarke = new Object();

private static Map proxyClass Collections.synchronizedMap(new WeakHashMap());

protected InvocationHandler h;

protected Proxy(InvocationHandler h)
{
this.h = h;
}

private Proxy(){}

public static Object newProxyInstance(ClassLoader loader,class<?> [] interface,InvocationHandler h)
{

if(h == null)
{
throw new NullPointerException();
}

Class cl = getProxyClass(loader,interface);

Constructor cons = cl.getConstructor(constructorParams); //constructorParams這個怎麽來的
cons.newInstance(new Object[]{h});

}

public getProxyClass



}

 

======================================动态代理总结================================

1 通过实现InvocationHandler接口创建自己的调用处理器

InvocationHandler handler = new InvocationHandlerImpl(...)

2 通过为Proxy类指定ClassLoader对象和一组interface创建动态代理类

Proxy.getProxyClass(classLoader,new Class[]{...});

3 通过反射机制获取动态代理类的构造函数,其参数类型是调用处理器接口类型

Constructor constructor = clazz.getConstructor(new Class[]{InvocationHandler.Class});

4 通过构造函数创建代理类实例,此时需要将调用处理器对象作为参数传入

Interfae Proxy = constructor.newInstance(new Object[](handler));

为了简化对象创建过程,Proxy类中的newInstance方法封装了2-4,只需要两步即可完成代理对象的创建

生成的ProxySubject 继承 Proxy 类 实现 Subject接口,实现的Subject的方法实际调用处理器的invoke方法

而invoke方法利用反射调用的是被代理对象的方法

(Object)method.invoke(proxied,args)

动态代理

标签:win   system   zed   invoke   his   ble   print   cti   throws   

原文地址:http://www.cnblogs.com/jianbanxian/p/6207952.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!