动态代理

来源:互联网 发布:淘宝能搜索图片吗 编辑:程序博客网 时间:2024/04/30 09:25

         使用代理模式可以提高系统的性能(延迟加载)和对业务实现添加额外的功能(日志和事物等)。下面是动态代理的例子:

1.

package com.lanp.proxy.dyn;

/**
 * 业务接口MyCat
 * @author LanP
 * @version V1.0
 */
public interface MyCat {
 /**
  * 基本信息方法
  */
 void info();
 /**
  * 奔跑方法
  */
 void run();
}

2.

package com.lanp.proxy.dyn;

/**
 * MyCat接口的实现类
 * @author LanP
 * @version V1.0
 */
public class MyCatImpl implements MyCat {
 
 /**
  * (non-Javadoc)
  * @see com.lanp.proxy.dyn.MyCat#info()
  */
 @Override
 public void info() {
  System.out.println("I am a smart cat!");
 }
 
 /**
  * (non-Javadoc)
  * @see com.lanp.proxy.dyn.MyCat#run()
  */
 @Override
 public void run() {
  System.out.println("I am running...");
 }

}

3.

package com.lanp.proxy.dyn;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 代理对象的拦截器
 * @author LanP
 * @version V1.0
 */
public class MyInvocationHandler implements InvocationHandler {
 
 /**
  * 需要被代理的对象
  */
 private Object target;
 
 public void setTarget(Object target) {
  this.target = target;
 }
 
 /**
  * 执行动态代理的所有对象时,都会被替换成执行如下的方法
  * (non-Javadoc)
  * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
  */
 @Override
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  LogUtil logUtil = new LogUtil();
  //开始写日志
  logUtil.startLog();
  //执行目标对象的方法
  Object result = method.invoke(target, args);
  //完成写日志
  logUtil.endLog();
  return result;
 }

}

4.

package com.lanp.proxy.dyn;

import java.lang.reflect.Proxy;

/**
 * 生成动态代理的工厂
 * @author Lanp
 * @version V1.0
 */
public class MyProxyFactory {
 /**
  * 为指定的目标对象(target)生成动态代理对象
  * @param target
  * @return Object
  * @throws Exception
  */
 public static Object getProxy(Object target) throws Exception{
  MyInvocationHandler handler = new MyInvocationHandler();
  handler.setTarget(target);
  return Proxy.newProxyInstance(target.getClass().getClassLoader(),
    target.getClass().getInterfaces(), handler);
 }
}

5.

package com.lanp.proxy.dyn;

/**
 * 动态代理的测试类
 * @author LanP
 * @version V1.0
 */
public class MyProxyTest {

 /**
  * 测试动态代理
  * @param args
  */
 public static void main(String[] args) throws Exception{
  MyCat target = new MyCatImpl();
  MyCat myCat = (MyCat)MyProxyFactory.getProxy(target);
  myCat.info();
  myCat.run();
 }

}

 

原创粉丝点击