
今天的青岛依旧是阴雨蒙蒙,小雨淅淅中的学习之路显得有些泥泞,彼此同学间也敞开心扉,不再是刚刚到来时的拘谨。雨中,我们相互打量着。莫听穿林打叶声,何妨吟啸且徐行。
在这雨中,出发时刻便是显现了人生百态,
努力的本质,是打破固有的格局,迈出此间的泥淖,记住自己脆弱的时刻
一蓑烟雨任平生。料峭春风吹酒醒
在生活的轨迹上行走,总会遇到许多抉择,不排除风吹雨打和那些与之而来的坎坷与蹉跎,回首向来萧瑟处,这就是自己的生活和故事。
静态代理的缺点,如果当你要代理的方法越多时,你需要重复的逻辑就越多,假设你的目标类有100个方法,那么你的代理类就需要对这100个方法进行委托,但是又可能他们前后需要执行的逻辑时一样的,这样就会产生很多冗余。
这样,就有个更好的动态代理的方法出现了。
JDK代理
//客户端Client
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();
subject.request();
}
}
//subject接口,这个是jdk动态代理必须的前提。
public interface Subject {
void request();
void hello();
}
//目标对象RealSubject
public class RealSubject implements Subject{
@Override
public void request() {
System.out.println("real subject execute request");
}
@Override
public void hello() {
System.out.println("hello");
}
}
//代理类JdkProxySubject
public class JdkProxySubject implements InvocationHandler{
private RealSubject realSubject;
public JdkProxySubject(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");
Object result = null;
try{
//利用反射动态的来反射方法,这就是动态代理和静态代理的区别
result = method.invoke(realSubject,args);
}catch (Exception e){
System.out.println("ex:"+e.getMessage());
throw e;
}finally {
System.out.println("after");
}
return result;
}
}
转载代码原地址Spring IoC和AOP的实现原理解析(整理版) - 牧梦者 - 博客园 (cnblogs.com)