注意这里,既然他说基于接口来实现的:
在Proxy.newProxyInstance() 第 2个参数里一定要传入 "接口.class" ,而不是 "类.class"
那么光看接口怎么知道代理的目标具体是那个类呢? 就是第3个 参数里即 handler 里面决定的。
注意此處的Proxy是來至於jdk,而不是剛才自定義的那個pattern.Proxy
所以,靜態代理自定義一個代理類,動態代理則是實現一個InvocationHandler接口的代理類
動態代理使用java.lang.reflect提供的Proxy工廠類,再傳入接口(Subject)、與目標對象
jdk动态代理
JDK动态代理:基于接口代理
455444444444444444444444444444444444444
dddddddddddddddddddddddddddddddd
public class Client {
public static void main(String[] args){
Subject subject = (Subject) Proxy.newProxyInstance(Client.class.getClassLoader(),new Class[]{Subject.class},new JdkProxySubject(new RealSubject()));
subject.hello( );
}
}
静态代理与动态代理
JDK实现要点
JDK实现要点 --动态代理中的基于接口
动态代理:基于接口代理与基于继承代理
public class JdkProxy implements InvocationHandler { Object realObj = null; public JdkProxy(Object obj) { this.realObj = obj; } // 反射实现动态代理 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("befor"); Object result = null; try { result = method.invoke(realObj, args); } catch (Exception ex) { System.out.println("ex:" + ex.getMessage()); throw ex; } finally { System.out.println("after"); } return result; } }
jdk动态代理
JDK实现要点:
1类:java.lang.reflect.Proxy;
2接口:InvoctionHandler;
3只能基于接口进行动态代理
静态代理的缺点:
代理的方法越多,重复的代码越多;
因此产生了动态代理技术。
动态代理:接口实现方式,cglib继承实现方式。
JDK实现要点:
1类:java.lang.reflect.Proxy;
2接口:InvoctionHandler;
3只能基于接口进行动态代理
静态代理:代理方法多的时候,重复的逻辑就多,一个目标类对应一个代理类
jdk动态代理实现要点
感觉这样写更好:
public class JdkProxy implements InvocationHandler { Object realObj = null; public JdkProxy(Object obj) { this.realObj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("befor"); Object result = null; try { result = method.invoke(realObj, args); } catch (Exception ex) { System.out.println("ex:" + ex.getMessage()); throw ex; } finally { System.out.println("after"); } return result; } }
实现代表 包括JDK和Cglib
动态代理实现方式
静态代理在实现复杂逻辑的时候,重复的逻辑会有很多,所以出现了动态代理.这表示在实际项目的时候要更多的使用动态代理.
JDK实现要点
dynamic
Proxy动态生成代理类
织入的逻辑是实现InvocationHandler
静态代理:代理方法多的时候,重复的逻辑就多,一个目标类对应一个代理类
动态代理:
两大动态代理
动态代理JDK实现要点
JDK实现动态代理要点
动态代理比较静态代理