`
bearjava
  • 浏览: 81084 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

JDK动态代理

    博客分类:
  • Java
阅读更多
代理模式是给一个对象提供代理,以控制对它的访问,如只有授权用户才可以访问某个对象,给对象添加日志、事务功能。
JDK动态代理是提供运行时实现代理模式的一种方法,但是只支持接口类型。
Cglib可以支持类的代理。
/**业务接口*/
public interface IHello {
	
	public void hello(String name);
	
}

/**业务接口实现*/
public class HelloSpeaker implements IHello {

	@Override
	public void hello(String name) {
		System.out.println("Hello " + name);
	}
}

/**业务代理*/
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);
	}
	
	@Override	
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result = null;
		try{
			//before handling
			logger.log(Level.INFO,"method starts..."+method.getName());			
			result = method.invoke(delegate, args);			
			//after handling
			logger.log(Level.INFO,"method ends..."+method.getName());
		}catch(Exception e){
			logger.log(Level.INFO,e.toString());
		}
		return result;
	}
}

/**Client*/
public class ProxyDemo {
	
	public static void main(String[] args){
		LogHandler handler = new LogHandler();
		IHello speaker = new HelloSpeaker();
		IHello speakerProxy = (IHello)handler.bind(speaker);
		speakerProxy.hello("Proxy");
	}
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics