Java 动态代理
一:Proxy动态代理
JDK生成最终真正的代理类,它继承自Proxy并实现了我们定义的IText接口,在实现IText接口方法的内部,通过反射调用了TestInvocationHandler的invoke方法。
需要元素,
1、InvocationHandler实现类,只能对接口进行代理;
2、被代理接口即interface
3、被代理接口的实现类
第1步:定义interface
public interface IText{
public String test(String arg);
}
第2步:实现接口
public class ImplText implements IText{
public String test(String arg){
return "";
}
}
第3步:实现InvocationHandler类
public class TestInvocationHandler implements InvocationHandler{
/***
*Object proxy代理对象
*Method method,被代理方法
*Object[] objs 执行方法所需要的参数列表
*
*
*/
Object target;//实际被代理对象
public TestInvocationHandler(Object target){'
this.target=target;
}
/
public Object invoke(Object proxy,Method method,Object[] objs){
return method.invoke(target,objs);
}
}
第4步:
ImplText impl=new ImplText();
TestInvocationHandler in=new TestInvocationHandler(impl);
IText ite=Proxy.newProxyInstance(ImplText.class.getClassLoader(),new Class[]{IText.class},in)
ite.test("==");
二:CGLib 第三方框架,主要是利用字节码生成被代理类的的子类,然后在子类中对 被代理方法前后后方插入逻辑代码。
1、
public class UserManager {
public void function(){
}}
2、public class CglibProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz){
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println(“method before”);
Object result = proxy.invokeSuper(obj,args);
System.out.println(“method affter”);
return result;
}
}
3、
CglibProxy proxy = new CglibProxy();
UserManager um = (UserManager)proxy.getProxy(UserManager.class);
um.function();