`

5、动态代理

 
阅读更多

1、Java的动态代理机制
代理模式是常用的Java设计模式。代理类主要负责为委托类预处理消息、过滤信息、把消息转发给委托类,以及事后处理信息等。
动态代理类不仅简化了编程工作,而且提高了软件系统的扩展性和可维护性。我们可以通过实现java.lang.reflect.InvocationHandler接口提供一个执行处理器,然后通过java.lang.reflect.Proxy得到一个代理对象,通过这个代理对象来执行业务逻辑方法,在业务逻辑方法被调用的同时,自动调用会执行处理器。

注意:被代理对象至少实现一个接口

/**
 * 动态代理对象处理类
 * @author Administrator
 *
 */
public class AOPInterceptor implements InvocationHandler{
	
	/**
	 * 构造函数
	 * @param target  被代理对象
	 * @param beforeAdvisor 对象方法执行前顾问
	 * @param afterAdvisor  对象方法执行后顾问
	 */
	public AOPInterceptor(Object target, Advisor beforeAdvisor,
			Advisor afterAdvisor) {
		super();
		setTarge(target);
		this.beforeAdvisor = beforeAdvisor;
		this.afterAdvisor = afterAdvisor;
	}

	private Object target;
	
	private Object proxy;
	
	private Advisor beforeAdvisor;
	
	private Advisor afterAdvisor;
	
	public void setTarge(Object obj){
		this.target = obj;
		//生产代理类
		Object proxy = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
		this.proxy = proxy;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		if(beforeAdvisor != null)
			beforeAdvisor.doAdvisor(proxy, method, args);
		//执行被代理对象中的方法
		Object result = method.invoke(target, args);
		if(afterAdvisor != null)
			afterAdvisor.doAdvisor(proxy, method, args);
		return result;
	}

	public Object getTarget() {
		return target;
	}

	public Advisor getBeforeAdvisor() {
		return beforeAdvisor;
	}

	public void setBeforeAdvisor(Advisor beforeAdvisor) {
		this.beforeAdvisor = beforeAdvisor;
	}

	public Advisor getAfterAdvisor() {
		return afterAdvisor;
	}

	public void setAfterAdvisor(Advisor afterAdvisor) {
		this.afterAdvisor = afterAdvisor;
	}

	public Object getProxy() {
		return proxy;
	}
	
	

}

 

测试类

public class ProxyTest {
	
	@Test
	public void testAdd(){
		MessageBean bean = new MessageBeanImpl();
		Advisor beforeAdvisor = new BeforeAdvisor();
		Advisor afterAdvisor = new AfterAdvisor();
		//动态代理对象处理类,可以获得bean的代理类
		AOPInterceptor aop = new AOPInterceptor(bean, beforeAdvisor, afterAdvisor);
		//获得代理类并执行add方法
		((MessageBean)aop.getProxy()).add("hahha");
	}

}

 

 

2、cglib动态代理

cglib:code generation library。是一个强大的,高性能,高质量的Code生成类库,可以将没有实现接口的对象实现动态代理。

我们可以通过实现MethodInterceptor接口提供一个执行处理器,然后通过Enhancer获得动态代理类。

现在我们通过cglib动态代理实现权限控制,

(1)首先编写AuthProxy,实现MethodInterceptor接口

 

 

 

public class AuthProxy implements MethodInterceptor{
	
	public AuthProxy(String name) {
		super();
		this.name = name;
	}

	private String name;
	
	@Override
	public Object intercept(Object obj, Method method, Object[] arg,
			MethodProxy proxy) throws Throwable {
		if(!"qiang1".equals(this.name)){
			return null;
		}
		return proxy.invokeSuper(obj, arg);
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	
}

 

 

(2)获得代理对象

	/**
	 * 根据权限获得InfoManager
	 * @param auth
	 * @return
	 */
	public static InfoManager getAuthInstance(AuthProxy auth) {
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(InfoManager.class);
		enhancer.setCallbacks(new Callback[]{auth,NoOp.INSTANCE});
		enhancer.setCallbackFilter(new AuthProxyFilter());
		return (InfoManager) enhancer.create();
	}

 

这样就实现了只有用户名为"qiang1"的用户才能执行。

 

分享到:
评论

相关推荐

    qt qtableview动态代理

    通过动态代理,在单元格中添加spinbox,checkbox,combobox。

    Spring aop 之 静态代理 动态代理 Aspectj aop-config 等实现方式

    主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...

    java动态代理和cglib动态代理示例分享共5页.pdf

    java动态代理和cglib动态代理示例分享共5页.pdf.zip

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    - 静态代理与动态代理 - 常见的动态代理实现 - JDK Proxy - CGLIB - JDK Proxy 和 CGLIB 的对比 - 动态代理的实际应用 - Spring AOP 说在前面:今天我们来聊一聊 Java 中的代理,先来聊聊故事背景: 小明想...

    AOP技术及其在J2EE中动态代理实现

    术解决在软件开发中OOP难以解决的问题以及提高开发效率,利用JAVA的反射机制,研究了AOP的动态代理实现原 理,说明了其可行性,体现了AOP技术应用价值和发展前景。 关键词:AOP;动态代理;横切关注点

    cglib动态代理需要的包

    cglib动态代理需要的jar包下载:cglib动态代理类所需的jar包 ,一共5个jar包,asm-3.3.1.jar、cglib.jar、cglib-full.jar、cglib-nodep-2.1_3.jar、cglib-src-2.2.jar

    java动态代理项目实践优化(5)

    java动态代理项目实践优化(5)

    基于Class字节码透视java动态代理本质(5)

    基于Class字节码透视java动态代理本质(5)

    java设计模式

    12.4.5 动态代理 12.5 最佳实践 第13章 原型模式 13.1 个性化电子账单 13.2 原型模式的定义 13.3 原型模式的应用 13.3.1 原型模式的优点 13.3.2 原型模式的使用场景 13.4 原型模式的注意事项 13.4.1 构造函数不会被...

    IEProxy IE代理

    IE代理 免费代理 代理服务器 快速的代理 上网代理 浏览器免费代理 代理服务器地址列表 代理服务器软件 代理IP 代理在线 Internet Explorer 免费代理 免费代理服务器 免费代理服务器地址 免费代理软件 代理IP 代理...

    UE4代理使用代码.zip

    UE4/UE5代理使用方法 分别是 单播,多播,动态单播,动态多播,可继承的Event

    动态代理的5模式使用示例和Mixin模式

    重量级的ORM和IOC产品离不开动态代理,作为开发人员,多数情况不用关注动态代理的内部实现机制,但是了解其一般的规律和模式还是有必要的,比如:虽然你开发期间采用了POCO,因为开启了动态代理,运行期间则不是POCO...

    私密代理代理池方案(详细看说明)

    定时检测存储模块的代理是否可用,这里我购买的代理失效时间快,所以这里分数定义为50,但有一个IP不可用,分数-5,否则直接回调50,当分数为0,证明这个代理不可用,直接删除代理。(新获取下来的代理设置初始分数...

    DM 集群代理的架构

    5动态视图管理 8 5.1V$SESSIONS 8 5.2V$SYSSTAT 8 5.3V$DCPINSTS 8 5.4V$DCP_CONNPOOL 9 6典型案例 10 6.1经典情景一:普通 MPP 环境 10 6.2经典情景二:MPP 主备环境 14 6.3经典情景三:多个 DCP 同时提供服务 32

    微商城系统开发交易代理广告会员h5搭建可二次开发成品源码搭建定制

    这一点在这个功能中可以清晰的体现出来,而且企业和代理商可以随时查询订单的进度和动态,因为每个环节都可以监控,完全是避免出现错单,漏单的情况。 2.避免因为订单失误可能造成企业和代理商造成损失可以选择自己...

Global site tag (gtag.js) - Google Analytics