日期:2014-05-17 浏览次数:20731 次
/** * 此处可以为接口也可以为抽象类 * @author ljn * */ public interface IHelloSpeaker { public abstract void hello(); } /** * 接口实现类日志功能 简单的打印一句话 * @author ljn * */ public class HelloSpeaker implements IHelloSpeaker { public void hello(){ System.out.println("............this is Log"); } } /** * 代理类实现IHelloSpeaker接口,同时拥有实际对象的引用(private HelloSpeaker helloObj;//代理类内部引用真实类) * 代理必须完成委托对象的动作,也可以添加自己的动作(doBefore,doAfter)。 * * @author ljn * */ public class HelloProxy implements IHelloSpeaker { private HelloSpeaker helloObj;// 代理类内部引用委托类 public HelloProxy(HelloSpeaker helloSpeaker) { this.helloObj = helloSpeaker; } private void doBefore() { System.out.println("method doBefore invoke!"); } private void doAfter() { System.out.println("method doAfter invoke!"); } @Override public void hello() { // TODO Auto-generated method stub doBefore();// 其他业务逻辑 helloObj = new HelloSpeaker(); helloObj.hello();// 委托类具体的业务逻辑。 doAfter();// 其他业务逻辑 } } /** *测试类 */ public class Test { public static void main(String[] args) { //其中HelloProxy中helloObject为需要代理的对象,在其它地方如下来使用代理机制 IHelloSpeaker proxy = new HelloProxy(new HelloSpeaker()); proxy.hello(); } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class LogHandler implements InvocationHandler { private Object delegate; public Object bind(Object delegate) { this.delegate = delegate; return Proxy.newProxyInstance( delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; try { System.out.println("method starts..."+method); result = method.invoke(delegate, args); System.out.println("method starts..."+method); } catch (Exception e){ e.printStackTrace(); } return result; } } //测试程序 public static void main(String[] args) { LogHandler logHandler = new LogHandler(); IHelloSpeaker helloProxy = (IHelloSpeaker) logHandler.bind(new HelloSpeaker()); helloProxy.hello(); }