以下随笔不作为参考:
为什么需要代理呢:想象下这样一个场景:某地主frank 家里有几栋豪宅要准备卖出去 ,可是自己却没时间和顾客一对一面谈,于是他委托房产中介,让中介帮忙代理自己的卖房行动,中介就会和顾客去谈,这些谈判的行动都不用frank 自己完成,因此代理的作用就是,在真实对象访问之前或之后加入自己的逻辑。这就是代理模式
jdk 动态代理必须借助一个接口才能产生代理对象,然后是实现了接口的实现类,在jdk 动态代理中要实现代理逻辑类必须实现
InvocationHandler 接口,它里面定义了invoke 方法。
接口(也就是要代理的对象):
public interface Service {
void say();
}
接口实现类 :
public class Serviceimpl implements Service{
@Override
public void say() {
System.out.println("hello");
}
}
代理逻辑类:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class jdkProxy implements InvocationHandler {
Object target;
public jdkProxy() {
}
public jdkProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("调用之前");
Object object= method.invoke(target,args);
System.out.println("调用之后");
return object;
}
}
测试类:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import static java.lang.reflect.Proxy.newProxyInstance;
public class Main {
public static void main(String[] args) {
Service service=new Serviceimpl();
InvocationHandler handler=new jdkProxy(service) ;
//生成代理对象实例 括号的第一个参数是类加载器 第二个参数表示把生成的动态代理对象下挂在哪些接口下,第三个是定义方法逻辑的代理类 invoke 方法就是代理逻辑方法现实方法 感兴趣的同学可以研究下源码
Service service1= (Service) Proxy.newProxyInstance(service.getClass().getClassLoader(),service.getClass().getInterfaces(),handler);
service1.say();
}
}
运行结果