`

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动态代理

    然而,QTableView的功能可以进一步增强,通过实现动态代理(Dynamic Proxy)来扩展其交互性。动态代理允许我们在表格的单元格内嵌入其他UI元素,比如QSpinBox、QCheckBox或QComboBox,从而提供更丰富的用户交互体验...

    java动态代理demo

    5. **动态代理示例** - 首先,定义一个接口,如`MyService`,包含一些业务方法。 - 创建一个实现了`MyService`接口的目标对象,如`RealService`,实现接口中的方法。 - 实现`InvocationHandler`接口,重写`invoke...

    JDK动态代理源码

    在Java编程领域,JDK动态代理是一个非常重要的概念,它允许我们在运行时动态地创建一个实现了特定接口的代理对象,以此来拦截并扩展原有对象的行为。动态代理在很多场景下都有应用,比如AOP(面向切面编程)、事件...

    使用cglib演示动态代理时用到的jar包 aop 动态代理

    动态代理是实现AOP的一种方式,而在Java中,CGLIB(Code Generation Library)是一个常用的库,专门用于创建子类动态代理。下面我们将详细探讨AOP、动态代理以及CGLIB的相关知识点。 首先,AOP的核心概念是“切面”...

    Java实现动态代理

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以作为原有对象的“中间人”,在调用原有方法前或后执行额外的操作,如日志记录、性能监控、事务管理等。动态代理在很多...

    包含静态代理和动态代理demo代码

    在这个“包含静态代理和动态代理demo代码”的压缩包中,我们可能会看到两种常见的Java代理实现方式的示例:静态代理和动态代理。 首先,我们来详细讲解静态代理。在静态代理中,代理类和真实类(目标类)都是在编译...

    java 动态代理实例(JDK代理与CGLIB代理)

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建对象的代理,从而可以在不修改原有代码的情况下,对原有对象的行为进行扩展或增强。动态代理主要分为两种:JDK代理和CGLIB代理。 **JDK代理**是...

    动态代理原理详细指南

    动态代理在软件开发中是一种非常重要的设计模式,它允许我们创建一个对象,该对象能代替或代表另一个对象执行某些操作。这种模式使得我们可以在不修改原有代码的基础上,为已有对象添加新的功能,如日志、事务管理、...

    动态代理(AOP)简单例子

    动态代理(Aspect-Oriented Programming,AOP)是面向切面编程的一种编程范式,它主要用来解决传统面向对象编程中难以处理的横切关注点问题。这些关注点,如日志、事务管理、安全检查等,往往分散在程序的各个角落,...

    动态代理原理实例Demo

    Java动态代理是Java编程中一个非常重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以代替原对象执行某些额外的操作,而无需修改原对象的代码。动态代理在AOP(面向切面编程)中广泛应用,如日志记录、...

    java 简答可复用动态代理类

    Java动态代理是一种强大的技术,它允许我们在运行时创建对象,这些对象可以作为其他对象的代理,从而在调用实际方法之前或之后执行额外的操作。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang....

    java 动态代理 完整版

    5. **调用代理对象的方法**:通过代理对象调用业务逻辑类的方法,从而实现动态代理。 #### 六、动态代理的应用场景 动态代理广泛应用于以下场景: - **日志记录**:在方法调用前后自动添加日志记录功能。 - **...

    Java反射机制与动态代理

    在实际应用中,Java的反射和动态代理常常结合使用,比如Spring框架中的AOP就是基于动态代理实现的。通过反射,Spring可以获取到bean的类信息,然后根据配置决定是否需要创建代理对象,如果需要,就会使用动态代理来...

    动态代理设置监听DEMO

    在Android开发中,动态代理是一种强大的工具,常用于实现事件监听、日志追踪、性能监控等功能。本DEMO主要展示了如何使用Java的动态代理机制来实现在不修改原有代码的情况下,为对象添加事件注入功能。这里我们将...

    ioc框架,通过动态代理实现.

    在IOC框架中,动态代理的实现方式主要有两种:JDK动态代理和CGLIB动态代理。 1. JDK动态代理:JDK内置的java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口提供了实现动态代理的能力。当被代理的...

    java动态代理机制

    Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...

    J2SE动态代理解析

    Java平台标准版(J2SE)中的动态代理技术是自JDK 1.3版本引入的一个强大特性,它使得开发者可以在程序运行时动态地创建符合特定接口的代理对象。动态代理在实际应用中广泛用于实现面向切面编程(AOP),如日志记录、...

    java动态代理 经典文章(word 2007格式的)

    Java动态代理是Java编程中一个重要的特性,它允许在运行时创建代理对象,这些代理对象可以代表并增强原对象的功能。动态代理主要应用于面向切面编程(AOP)和事件监听等场景,使得代码更加模块化,易于维护。以下是...

    Java动态代理案例演示代码

    Java动态代理是Java语言提供的一种强大的机制,它允许在运行时创建具有特定接口的代理类对象,这些代理类对象能够对方法调用进行拦截和增强。动态代理在很多场景下非常有用,例如AOP(面向切面编程)、事件监听、...

Global site tag (gtag.js) - Google Analytics