动态代理模式

使用静态代理,那么真实角色必须是事先存在的,并将其作为代理对象的内部属性,
在实际使用中,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀,
如果事先并不知道真实角色,那么就需要使用动态代理来解决

 

动态代理步骤
 1.创建一个实现接口InvocationHandler的类,它不许实现invoke方法
 2.创建被代理的类以及接口
 3.通过proxy的静态方法newProxyInstance创建一个代理
 4.通过代理调用方法

 

 

案例:

package DynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;
import java.util.Vector;

 * 该代理类的内部属性是object类型;实际使用的时候通过该类的构造方法传递进来一个对象
 *此外,该类还实现invoke方法,该方法的method、invoke其实是调用被代理对象将要执行的方法,
 *方法参数是sub,表示该方法从属于sub,通过动态代理类,我们可以在执行真实对象的方法的前后
 *加入自己的一些额外的方法
 * @author Administrator
 *
public class VectorProxy implements InvocationHandler{
 //obj要被代理的类引用
 private Object obj;
 
 public VectorProxy(Object obj){
  this.obj = obj;
 }
 ////proxy代理实例本身,一般用不上;method:要调用的方法所对应的对象;args调用方法所传递的参数;invoke这个方法中的参数是java底层传递的
 @Override
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  // TODO Auto-generated method stub
  
  if(args!=null){
   
  for(Object obj :args){
   
    System.out.println(obj);
   
       }
  }
  //obj;要被代理的那个类对象,方法参数
  Object object = method.invoke(obj, args);
  
      return object;
  
 }
 //该方法返回一个代理;newProxyInstance方法会在程序运行期间创建一个代理类;创建InvocationHandler实例;该类实现需要被代理那个类所实现的所有接口
 public static  Object factory(Object obj){
  
  return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new VectorProxy(obj));
  
 }
 
 public static void main(String[] args) {
  //返回代理,因为该需要代理的类是vector,而vector所实现的接口是List;所以可以使用多态就是List来接收这个代理
  List list = (List) factory(new Vector());
  //当调用add方法的时候;实际上是调用invoke方法
  list.add("你好吗");
  list.add("我很好");
  System.out.println(list);
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值