jdk代理和cglib代理

1.jdk静态代理(静态代理和动态代理) 本质:在内存中构建出接口的实现类。

  缺陷:只能对实现接口的类实现动态代理,
  使用cglib可以对没有实现接口的类进行动态代理。

2.cglib动态代理     本质:生成被代理对象的子类。

静态代理:proxy_static包下的一个接口和两个实现类

Subject 有两个实现类一个是真实类(RealSubject),一个是代理对象类(ProxySubject),分别重写Subject的eat()方法following:

1 public class RealSubject implements Subject {
2 
3     public void eat() {
4         System.out.println("real eat method begin~");
5     }
6     
7 }
RealSubject

//两种方式,分别是: 将真实对象暴露出来的方法  &&  不将真实对象暴露出来的方法

 1 public class ProxySubject implements Subject{
 2     private RealSubject realSubject;
 3     public void eat() {
 4         System.out.println("ProxySubject method begin~");
 5         realSubject.eat();
 6         System.out.println("ProxySubject method end~");
 7     }
 8     public RealSubject getRealSubject() {
 9         return realSubject;
10     }
11     public void setRealSubject(RealSubject realSubject) {
12         this.realSubject = realSubject;
13     }
14         //不将真实对象暴露出来
15     /*Subject realSubject = new RealSubject();
16     public void eat() {
17         System.out.println("ProxySubject method begin~");
18         realSubject.eat();
19         System.out.println("ProxySubject method end~");
20     }*/
21 }
ProxySubject
 1     @Test
 2     public void Proxy_Static(){
 3         //不将真实对象暴露出来的方法
 4 //        ProxySubject proxysubject = new ProxySubject();
 5 //        
 6 //        proxysubject.eat();
 7         
 8         //将真实对象暴露出来的方法
 9         RealSubject rs= new RealSubject();
10         ProxySubject ps = new ProxySubject();
11         ps.setRealSubject(rs);
12         ps.eat();
13         
14     }
测试

 jdk动态代理:

proxy_dynamic包下的一个接口和一个实现类

写法依然是最普通的写法,重点在测试类里面

测试如下

 1 @Test
 2     public void Proxy_jdk_Dynamic(){
 3         final IUserDao dao =new UserDaoImpl();
 4         Object instancedao = Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(),new InvocationHandler() {
 5             public Object invoke(Object proxy, Method method, Object[] args)
 6                     throws Throwable {
 7                 System.out.println("增强 begin~");
 8                 Object invoke = method.invoke(dao, args);
 9                 System.out.println("增强 end~");
10                 return invoke;
11             }
12         });
13         System.out.println(((IUserDao)instancedao).add());
14     }

 cglib动态代理:

 测试如下:

 1     @Test
 2     public void Proxy_cglib_Dynamic(){
 3         final Dog dog = new Dog();
 4         Enhancer enhancer = new Enhancer();
 5         enhancer.setSuperclass(dog.getClass());
 6         enhancer.setCallback(new MethodInterceptor() {
 7             public Object intercept(Object proxy, Method method, Object[] arg2,
 8                     MethodProxy methodproxy) throws Throwable {
 9                 System.out.println("begin~");
10                 Object invoke = method.invoke(dog, arg2);
11                 System.out.println("end~");
12                 return invoke;
13             }
14         });
15         
16         Dog dog2 =(Dog)enhancer.create();
17         dog2.Say();
18         
19     }
原文地址:https://www.cnblogs.com/john69-/p/5944725.html