记录:
查询与理解.
1.JDK动态代理
<1>.JDK动态代理需实现java.lang.reflect.InvocationHandler接口的invoke方法.
<2>.JDK动态代理使用java.lang.reflect.Proxy类的newProxyInstance方法创建代理接口.
<3>.JDK动态代理运行时需要接口,即传入的实例对象需要实现一个接口.
综上:JDK动态代理的实现是在运行时,根据一组接口定义,使用Proxy,InvocationHandler等工具类去生成一个代理类和代理类实例.
2.CGLIB动态代理
<1>.CGLIB(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口.
<2>.CGLIB动态代理需要实现net.sf.cglib.proxy.MethodInterceptor接口的intercept方法
<3>.CGLIB动态代理使用net.sf.cglib.proxy.Enhancer类的创建代理对象.
<4>.CGLIB动态代理运行时只需实现类,无需接口.
3.JDK动态代理实例
3.1 接口Topic
public interface Topic {
public void getInfo(String size);
}
3.2 接口实现类GirlTopic
public class GirlTopic implements Topic {
@Override
public void getInfo(String size) {
System.out.println("GirlTopic->GirlTopic开始......");
System.out.println("The girl is " + size +" cup.");
System.out.println("GirlTopic->GirlTopic开始......");
}
}
3.3 InvocationHandler接口实现类
public class JdkTopicProxy implements InvocationHandler{
private Object target;
public JdkTopicProxy(Object target){
this.target = target;
}
@SuppressWarnings("unchecked")
public <T> T getProxy(){
return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("JdkTopicProxy->invoke开始......");
Object result = method.invoke(target, args);
System.out.println("JdkTopicProxy->invoke结束......");
return result;
}
}
3.4 测试main方法
public class TestJdkProxyDemo {
public static void main(String [] args){
System.out.println("测试开始......");
// jdk动态代理测试
Topic topic = new JdkTopicProxy(new GirlTopic()).getProxy();
topic.getInfo("G");
System.out.println("测试结束......");
}
}
4.CGLIB动态代理
4.1 实现类GirlTopic
public class GirlTopic {
public void getInfo(String size) {
System.out.println("GirlTopic->GirlTopic开始......");
System.out.println("The girl is " + size +" cup.");
System.out.println("GirlTopic->GirlTopic开始......");
}
}
4.2 MethodInterceptor接口实现类
public class GirlMethodInterceptor implements MethodInterceptor{
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("GirlMethodInterceptor->intercept开始......");
Object object = proxy.invokeSuper(obj, args);
System.out.println("GirlMethodInterceptor->intercept结束......");
return object;
}
}
4.3 测试main方法
public class TestCglibProxyDemo {
public static void main(String[] args){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(GirlTopic.class);
enhancer.setCallback(new GirlMethodInterceptor());
GirlTopic girlTopic = (GirlTopic)enhancer.create();
girlTopic.getInfo("F");
}
}
以上,感谢.