java 反射机制初探 女爷i 2022-10-16 09:47 108阅读 0赞 最近再看书时,书中使用了java的动态代理机制,随即在网上搜了些文章看了一下,既然有动态代理那就有静态代理,所谓静态代理,就是在你些的代理类中需要使用到具体的被代理类。而所谓动态代理,则不需要在代理类中使用到被代理类,根本不知道起要代理那个类。在jdk1.3后java加入了动态代理功能的api,动态代理主要用在面向接口编程上,业务逻辑的实现类必须实现某业务接口,通过使用动态代理, 我们可以在代理类中拦截器功能。java的动态代理功能是通过实现java.lang.reflect.InvocationHandler接口来实现的。实现类必须实现接口中定义的invoke方法。下面是一段实现动态代理的代码。 package com.spring; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.logging.\*; /\*\* \* 此类用于实现动态代理 \* @author paul \* \*/ public class LogHandler implements InvocationHandler \{ private Logger logger = Logger.getLogger(this.getClass().getName()); private Object delegate; //绑定被代理对象,返回被代理对象所实现的接口 public Object bind(Object delegate) \{ this.delegate = delegate; return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this); \} public Object invoke(Object proxy, Method method, Object\[\] args) throws Throwable \{ Object result = null; try \{ log("method1" + method); result = method.invoke(delegate, args); logger.log(Level.INFO, "method ends" + method); \} catch (Exception e) \{ log(e.toString()); \} return result; \} private void log(String message) \{ logger.log(Level.INFO, message); \} \} 一下是定义业务逻辑方法的 package com.spring; public interface IHello \{ public void hello(String name); \} 一下是接口实现类,即业务逻辑实现类 package com.spring; /\*\* \* 此类用于实现业务逻辑 \* @author Administrator \* \*/ public class HelloSpeaker implements IHello \{ /\*\* \* 实现接口方法 \* @return void \*/ public void hello(String name) \{ System.out.println("Hello," + name); \} \} 一下是用于测试的类 package com.spring; public class ProxyDemo \{ /\*\* \* @param args \*/ public static void main(String\[\] args) \{ // HelloProxy proxy=new HelloProxy(new HelloSpeaker()); // proxy.hello("paul"); LogHandler loghandler = new LogHandler(); IHello helloProxy = (IHello) loghandler.bind(new HelloSpeaker());// 绑定代理对象 helloProxy.hello("paul");// 该句执行时会调用invoke方法 \} \}
还没有评论,来说两句吧...