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