jdk动态代理
jdk自带,必须有接口的类才可以使用该代理
//继承InvocationHandler实现invoke
public class DynamicProxy implements InvocationHandler {
private Object target ;
public DynamicProxy(Object target ) {
this.target=target;
}
//每次创建代理对象就会执行下面的方法,proxy是本代理对象,method是当前执行的方法,可以在这里过滤获取目标方法,参数三是该方法的参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(target, args);//调用invoke,传入目标对象和参数进行执行之前的方法
after();
return result;
}
private void after() {
System.out.println("之前");
}
private void before() {
System.out.println("之后");
}
}
使用
public static void main(String[] args) {
Hello helloImpl = new HelloImpl();
DynamicProxy dynamicProxy = new DynamicProxy(helloImpl);
//创建代理对象,使用到静态工具方法Proxy.neweProxyInstace(类加载器,接口类,增强类);返回值为代理的对象
Hello helloProxy = (Hello) Proxy.newProxyInstance(helloImpl.getClass().getClassLoader(), helloImpl.getClass().getInterfaces(), dynamicProxy);
helloProxy.say("zhangsan");
}
cglib
无需接口都可使用该代理
public class CGLibProxy implements MethodInterceptor {
/***
* 快速创建动态代理对象
* @param cls 需要代理的字节码对象
* @return 代理对象
*/
public <T> T getProxy(Class<T> cls){
return (T) Enhancer.create(cls,this);
}
/***
* 拦截的方法
* @param obj 原对象
* @param method 源对象中的方法
* @param args 源方法中的参数
* @param proxy 方法代理
*
* @return 返回代理对象
*/
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
before();
//执行原方法
Object result = proxy.invokeSuper(obj, args);
after();
return result;
}
private void after() {
System.out.println("之前");
}
private void before() {
System.out.println("之后");
}
}
使用
public static void main(String[] args) {
CGLibProxy cgLibProxy = new CGLibProxy();
HelloImpl helloProxy = cgLibProxy.getProxy(HelloImpl.class);
helloProxy.say("张三");
}
网友评论