-
MethodInterCeptor
与JDK的InvocationHandler类似
用方法反射调用目标对象的方法,把真正的业务逻辑委托给目标对象
查看全部 -
Cglib实现:
1:生成指定类对象的子类,也就是重写类中的业务函数。
2:执行回调函数,加入intercept()函数。
3:创建这个类的子类对象。
-----------------------------------------
反射技术实现; methodProxy.invokeSuper();
查看全部 -
保存生成的字节码:System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");
public class Client {
public static void main(String[] args){
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
Subject subject = (Subject) Proxy.newProxyInstance(Client.class.getClassLoader(),new Class[]{Subject.class},new JdkProxySubject(new RealSubject()));
subject.hello();
}
}查看全部 -
jdk运行期动态代理源码解析:其实就是真实类实现一个接口,我们再写一个类似于切面的类,实现invocationhandler接口且实现invoke方法,同时要保存真实类对象,初始化时赋值对象,invoke方法中反射方式调用真实对象方法,在方法前后可以加上定制的逻辑,这个方法其实是动态代理对象调用的,动态代理对象是客户端通过动态代理类实例化的,而动态代理类是真实对象方法执行前的运行期生成的.class类,这个类实现了和真实对象一样的接口,所以也有真实对象的方法,调用代理对象方法时也就可以传入参数,然后代理对象再将方法和参数传递给invocationhandler的实例对象。
查看全部 -
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( );
}
}查看全部 -
/**<br/> * aspect<br/> * Created by cat on 2017-02-27.<br/> */<br/>public class JdkProxySubject implements InvocationHandler{<br/><br/> private RealSubject realSubject;<br/><br/> public JdkProxySubject(RealSubject realSubject) {<br/> this.realSubject = realSubject;<br/> }<br/><br/> @Override<br/> public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {<br/> System.out.println("before");<br/> Object result = null;<br/> try{<br/> result = method.invoke(realSubject,args);<br/> }catch (Exception e){<br/> System.out.println("ex:"+e.getMessage());<br/> throw e;<br/> }finally {<br/> System.out.println("after");<br/> }<br/> return result;<br/> }<br/>}<br/>jdk根据反射机制,创建Subject实例的。因为在调用Proxy的newProxyInstance方法时,会传入一个class泛型接口数组,jdk内部源码会根据你传入的参数进行反射,并创建该接口的实现类实例,最后调用该实例的方法。<p><br/></p><p></p>查看全部
-
静态代理与动态代理
查看全部 -
JDK实现要点
查看全部 -
被代理接口类:
/**
* Created by cat on 2017-02-27.
*/
public interface Subject {
void request();
void hello();
}
实现被代理类接口的代理类:public class RealSubject implements Subject{
@Override
public void request() {
System.out.println("real subject execute request");
}
@Override
public void hello() {
System.out.println("hello");
}
}
代理对象的类:public class Proxy implements Subject{
private RealSubject realSubject;
public Proxy(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public void request() {
System.out.println("before");
try{
realSubject.request();
}catch (Exception e){
System.out.println("ex:"+e.getMessage());
throw e;
}finally {
System.out.println("after");
}
}
@Override
public void hello() {
realSubject.hello();
}
}
客户端调用代理类:实际调用的是代理的实现类,而代理的实现类具体业务又是委托给RealSubject来执行的
/**
* Created by cat on 2017-02-27.
*/
public class Client {
public static void main(String[] args){
Subject subject = new Proxy(new RealSubject());
subject.request();
}
}查看全部 -
1、客户端通过接口引用目标对象或代理对象,这里体现了面向对象的面向接口,客户端调用的目标对象的方法,代理对象都要有,因此目标对象和代理对象共同作为接口的实现类
2、代理对象把真正的方法委托给目标对象来执行,自己就执行额外的也就是AOP要织入的逻辑,即客户端调用代理的方法,同时给代理类传入目标对象,在代理类里面代理类通过目标对象来调用目标类的方法,在执行方法前后加上代理类的逻辑
查看全部 -
代理AOP对象
caller:调用方
target:目标对象
proxy:代理对象
客户端通过代理对象间接地和目标对象交互
目标对象委托了代理对象来跟客户端交互
查看全部 -
原理概述:运行时织入查看全部
-
原理概述:运行时织入
查看全部 -
内容大纲:
查看全部 -
@After在代码执行之后的植入查看全部
举报