`
zk_chs
  • 浏览: 215883 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

java动态代理示例,自己实现Aop

 
阅读更多

这次的博客将会介绍两种动态代理的方式,一种为jdk动态代理,一种为cglib动态代理,在代码方面将会使用最少的代码来完成,类会尽量的少,帮助大家理解。

 

先讲一下这两种代理方式的主要区别,jdk动态代理要求代理的类必须要有实现的接口,而cglib是通过创建子类进行代理,不需要实现接口,具体操作马上介绍。

 

首先创建一个接口、一个类实现接口:

 

public interface Action {
	void action();
}
public class Person implements Action{
	@Override
	public void action() {
		System.out.println("切面");
	}
}

 

 

下面创建一个处理器类,实现jdk的InvocationHandler接口,这个处理器类用来对代理对象进行处理:

public class PersonInvocationHandler implements InvocationHandler{
	private Person p;
	public PersonInvocationHandler (Person p){
		this.p = p;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("前置事件");
		method.invoke(p, args);
		System.out.println("后置事件");
		return null;
	}
}

 在这个类中的参数介绍:

 

private Person p:需要进行Aop的对象,你可以改为任何想要的形式,比如private Object obj;或者你自己现在

创建一个类,然后写入。

Object proxy:基本不会用到,是jdk动态代理生成的对象,之后马上介绍,可以忽略。

Method method:jdk动态代理生成的代理对象所调用的方法。

Object args[]:上面method的参数。

 

这样看起来,我们的对象和PersonInvocationHandler还完全没有联系起来,接下来,我们将两者进行关联,创建一个Test测试类,内部只有一个main方法:

public class Test {
	public static void main(String[] args) {
		Person p = new Person();
		InvocationHandler h = new PersonInvocationHandler(p);
		
		Action proxy = (Action) Proxy.newProxyInstance(p.getClass().getClassLoader(), p.getClass().getInterfaces(), h);
		proxy.action();
	}
}

 首先创建一个Person类的对象p,我们要对p的action方法进行Aop,那么便需要与之前的PersonInvocationHandler联系起来,我们在创建PersonInvocationHandler的时候指定了构造函数,那么按照构造函数创建一个对象h,此h对象便是处理器。

接着创建一个代理对象,该对象通过java.lang.reflect.Proxy类的newProxyInstance方法创建,参数三个,分别为:

ClassLoader:类加载器,使用p.getClass().getClassLoader()即可。

Class<?>[]:jdk创建的代理对象需要实现的接口,数组形式。

InvocationHandler:处理器,创建的代理对象的任何方法都会经过该处理器,aop的关键

 

我们通过Proxy.newProxyInstance方法创建的proxy对象在执行方法时,全部会通过PersonInvocationHandler中的invoke方法,在上面没有介绍的invoke方法中的Object proxy参数即为此处创建的proxy对象。

 

这样一来我们就实现了一个简单的动态代理,如果你要处理更复杂业务,只需要添加相应的业务代码到InvocationHandler中的invoke方法中便能实现。

 

 

 

虽然jdk动态代理已经很好用了,但我们有时候没有实现接口该怎么办呢,此时就需要请出cglib动态代理了。

 

cglib动态代理不再是创建实现了指定借口的对象了,而是创建继承了指定类的对象:

 

public class Test {
	public static void main(String[] args) {
		Enhancer en = new Enhancer();
		en.setSuperclass(Person.class);
		en.setCallback( new CGlibProxy() );   
		Person p = (Person) en.create();
		p.action();
	}
}
Enhancer翻译过来即为增强器,相当于jdk动态代理中的Proxy类,同样是用于创建代理对象,

 

setSuperclass(Class<?> clazz)用于指定需要继承的类。

setCallback(Callback callback)用于指定处理器。

 

在cglib中也有处理器,不过名字却叫做拦截器了,如下所示,实现了MethodInterceptor接口:

 

public class CGlibProxy implements MethodInterceptor {
	@Override
	public Object intercept(Object object, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {
		
		System.out.println("前置事件");		
		Object result = methodProxy.invokeSuper(object, args);		
		System.out.println("后置事件");		
		return result;

	}
}
内部有一个需要实现的方法intercept
Object object:通过Enhancer创建的代理对象。
Method method:目标方法的反射对象。
Object[] args:调用方法的参数。
MethodProxy:用来代替method的一个参数,可以调用父类的方法,如果使用method.invoke(object, args)的话,调用的还是我们创建的代理对象的方法,会发生无限递归。
 
 
到此为止应该就有了一个Aop的基本理解了,接下来可以试一下多个回调类,网上也有很多的博客能够学习,在这里我也贴一个吧
http://www.blogjava.net/stone2083/archive/2008/03/16/186615.html

 

 

 

 

分享到:
评论

相关推荐

    用java自己实现的动态代理 AOP

    Java动态代理是Java编程中一个重要的特性,它允许在运行时创建代理对象,这些代理对象可以作为原有对象的代理,实现在调用原有方法前后添加额外的功能,这正是AOP(面向切面编程)的核心思想。下面我们将深入探讨...

    java-用Java动态代理实现AOP.pdf

    在Java中实现AOP可以通过动态代理模式,其中Java动态代理是一个非常重要的实现方式。 Java动态代理机制要求被代理的类必须实现至少一个接口,因为Java动态代理是通过JDK的java.lang.reflect.Proxy类和java.lang....

    反射实现 AOP 动态代理模式(Spring AOP 的实现 原理) - Java 例子 -

    Spring框架是Java中实现AOP的一个流行工具,它通过动态代理机制实现了这一功能。本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切...

    java分页 动态代理 aop实现

    本话题主要围绕"Java分页"、"动态代理"以及"AOP(面向切面编程)"在Spring框架中的实现进行详细讲解。 首先,我们来看"Java分页"。在处理大量数据时,一次性加载所有数据不仅会消耗大量的内存,也可能导致用户界面...

    java使用动态代理来实现AOP(日志记录)的实例代码共6

    下面将详细阐述Java动态代理以及如何用它来实现AOP中的日志记录。 1. Java动态代理简介: Java中的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于...

    用Java动态代理实现AOP

    以下是如何使用Java动态代理实现AOP的一个简单示例: 首先,我们需要定义一个业务接口,例如`BusinessInterface`,该接口包含我们的核心业务逻辑方法,如`processBusiness()`。 ```java public interface ...

    使用java动态代理技术实现简单的AOP切面编程实例

    Java 动态代理技术是Java平台提供的一种强大的编程机制,它允许我们在运行时创建具有特定接口的代理对象,这些代理对象可以对方法调用进行拦截和处理,这正是AOP(面向切面编程)的核心思想。在Java中,动态代理主要...

    spring之AOP(动态代理)

    在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...

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

    - `设计模式:用Java动态代理实现AOP.docx`可能包含了如何使用Java动态代理来实现设计模式,尤其是代理模式,以达到AOP的效果。 - `Spring AOP入门实例详解.docx`可能涵盖了Spring AOP的基本概念、配置以及如何...

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

    以下是一个简单的Java动态代理示例: ```java public class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target = target;...

    动态代理和AOP详解

    在提供的源码文件中,可能包含了示例代码,如自定义的`InvocationHandler`实现、切点定义、通知配置等,你可以通过这些例子深入理解动态代理和Spring AOP的工作原理。 总结起来,动态代理和Spring AOP是Java和...

    java中动态代理,springAop.pdf

    Spring AOP(面向切面编程)是Spring框架的一部分,它利用了动态代理来实现切面的功能,如日志、事务管理、性能监控等。现在,让我们深入探讨Java动态代理及其在Spring AOP中的应用。 首先,我们需要了解Java动态...

    Java实现aop案例

    Java AOP(面向切面编程)是一种编程范式,它允许程序员定义“切面”,这些切面封装了特定关注点的代码,如日志、事务管理、权限检查等...文件列表中的"java实现aop案例"可能是示例代码或相关资源,供读者下载和实践。

Global site tag (gtag.js) - Google Analytics