动态代理
CGlib动态代理
克服没有接口类无法代理的问题。
前期工作:下载cglib-nodep-3.1.jar
下载地址:http://maven.outofmemory.cn/cglib/cglib-nodep/3.1/
或者
https://github.com/cglib/cglib
公共类对象
接口对象
package main;
public interface Hello {
void say(String name);
}
接口对象实现类
package main;
public class HelloImpl implements Hello{
@Override
public void say(String name) {
System.out.println("hello "+name);
}
}
CGLibProxy
package juntil;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* CGLib动态代理
* @author yong
*
*/
public class CGLibProxy implements MethodInterceptor {
private static CGLibProxy instance = new CGLibProxy();
public static CGLibProxy getInstance(){
return instance;
}
@SuppressWarnings("unchecked")
public <T> T getProxy(Class<T> cls){
return (T) Enhancer.create(cls,this);
}
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy proxy) throws Throwable {
before();
Object result = proxy.invokeSuper(o, args);
after();
return result;
}
private void after() {
System.out.println("After");
}
private void before() {
System.out.println("Before");
}
}
测试:
@Test
public void CGLibProxyTest(){
Hello hello = CGLibProxy
.getInstance()
.getProxy(HelloImpl.class);
hello.say("王二小");
}
Before
hello 王二小
After