java基础之动态代理

静态代理

一般来说:1个接口,2个实现类,在代理实现类的实现方法中调用真实类的方法。

  1. 定义接口。
interface Animal{
   public void show(); 
}
  1. 定义真正的实现类。
class Cat implements Animal{
   @Override
   public void show() {
     // TODO Auto-generated method stub
     System.out.println("我是一只猫。");
   }
}
  1. 定义代理类。
class ProxyCat implements Animal{
   Cat cat = null;
   public ProxyCat(Cat cat){
     this.cat = cat;
   }
   @Override
   public void show() {
      System.out.println("代理之前的操作");
      cat.show(); 
      System.out.println("代理之后的操作");
   }
}
public static void main(String[] args) {
   Cat realCat = new Cat();
   //生成一个代理类
   ProxyCat proxyCat = new ProxyCat(realCat);
   proxyCat.show();
 }

缺点:

  • 要为每一个类创建一个代理类,浪费资源;
  • 一个代理类只能为一个接口服务。

动态代理

interface Person{
   public void show();
}

创建实现类。

class US implements Person{  
   public void show(){
	System.out.println("美国人。");
   }
}

class Uk implements Person{
   public void show(){
       System.out.println("英国人。");
   }
}

创建InvocationHandler实现类。

class A implements InvocationHandler{
   private Object person = null;
   public A a(Object object){this.pereson = person;}
   @Override
   public Object invoke(Object proxy,Method method, Object[] args)throws Throwable{
    System.out.println("代理之前的操作");
    method.invoke(person,args);
    System.out.println("代理之后的操作");
    return null;
   }
}

main方法如下。

public static void main(String[] args){
   Person us= new Us();
   //生成一个美国人的代理类
   Person proxyUs = (Person)Proxy.newProxyInstance(
	Us.class.getClassLoader(),
	us.class.getInterfaces(),
	new A(us)
   );
        proxyUs.show();
  
   Uk uk = new Uk();
   //生成一个英国人的代理类
   Person proxyUk = (Person)Proxy.newProxyInstance(
	Uk.class.getClassLoader(),
	Uk.class.getInterfaces();
	new A(uk);
   );
   proxyUk.show();
}

我们可以再创建一个接口。

interface User{
  public void show();
}
public class Admin implements User{
  public void show(){
   System.out.println("管理员。");
  }
}

然后在main方法中改写。

public static void main(String[] args){
   User admin = new Admin();
   admin = (User)Proxy.newProxyInstance(
   	Admin.class.getClassLoader(),
   	Admin.class.getInterfaces(),
   	new A(admin)
   ); 
}

InvocationHandler 是一个接口,官方文档解释说,每个代理的实例都有一个与之关联的 InvocationHandler 实现类,如果代理的方法被调用,那么代理便会通知和转发给内部的 InvocationHandler 实现类,由它决定处理

优点:可以对不同接口的实现类进行代理。
缺点:要代理的类必须实现了某接口,否则出错。

CGLib动态代理

class SayHello{
   public void say(){System.out.println("Hello CGLib.")}
}

class MyMethodInterceptor implements MethodInterceptor{
   @Override
   //******sub:cglib生成的代理对象********//
   //******method:被代理对象的方法********//
   //******Object[]:方法入参********//
   //******methodProxy:代理方法********//
   public Object interceptor(Object sub,Method method,Object[] objects,MethodProxy methodProxy) throws Throwable{
     System.out.println("代理之前操作。");
     Object object = methodProxy.invokeSuper(sub,objects);
     System.out.println("代理之后操作。");
     return null;
   }
}

public static void main(String[] args){
   //**** 通过CGLIB动态代理获取代理对象的过程****//
    Enhancer enhancer = new Enhancer();
    //**** 设置enhancer对象的父类 ****//
    enhancer.setSuperClass(SayHello.class);
    //**** 设置enhancer的回调对象 ****//
    enhancer.setCallback(new MyMethodInterceptor());
    //**** 创建代理对象 ****//
    SayHello sayHello = (SayHello)enhancer.create();
    //**** 通过代理对象调用目标方法 ****//
    sayHello.say();
}

CGLib是为要代理的类生成了一个子类,然后进行操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值