黑马程序员技术交流社区
标题:
JAVA动态代理
[打印本页]
作者:
杨青
时间:
2013-6-5 01:21
标题:
JAVA动态代理
JAVA动态代理,为什么说它是动态的?
作者:
刘海芳
时间:
2013-6-5 09:46
本帖最后由 刘海芳 于 2013-6-5 09:47 编辑
额,因为实现了InvocationHandler的那个动态代理生成类可以你通过参数的不同,动态的生成不同的代理对象,而不是静态代理那样,要为每个代理类都写一个中间的代理对象,就程序的灵活上看像就是动态的,因为,无论你要生成任何的代理对象都用那个了,附静态代理和动态代理的代码区别...
静态代理:
package ttitfly.proxy;
public interface HelloWorld {
public void print();
}
package ttitfly.proxy;
public class HelloWorldImpl implements HelloWorld{
public void print(){
System.out.println("HelloWorld");
}
}
public class StaticProxy implements HelloWorld{
public HelloWorld helloWorld ;
public StaticProxy(HelloWorld helloWorld){
this.helloWorld = helloWorld;
}
public void print(){
System.out.println("Welcome");
//相当于回调
helloWorld.print();
}
}
复制代码
动态代理
:
package ttitfly.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类
public class DynamicProxy implements InvocationHandler{
private Object object;
//绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。
//Proxy.newProxyInstance的第三个参数是表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法
public Object bindRelation(Object object){
this.object = object;
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);
}
//拦截关联的这个实现类的方法被调用时将被执行
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Welcome");
Object result = method.invoke(object, args);
return result;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2