您的位置:首页 > 编程语言 > Java开发

JAVA动态代理实现aop的简单例子

2013-10-27 11:40 591 查看
aop是面向切面编程,是对OO面向对象思想的补充。

下面的例子的利用动态代理实现简单的AOP不用引入任何jar包,spring的AOP的实现原理就是动态代理。

相关java类:

1、业务处理接口

package sinosoft.dj.aop.proxyaop;

public interface IHello {

/**

* 业务处理A方法

* @param name

*/

void sayHello(String name);

/**

* 业务处理B方法

* @param name

*/

void sayGoogBye(String name);

}

2、业务处理实现类

package sinosoft.dj.aop.proxyaop;

public class Hello implements IHello{

public void sayHello(String name) {

System.out.println("Hello " + name);

}

public void sayGoogBye(String name) {

System.out.println(name+" GoodBye!");

}

}

3、日志类

package sinosoft.dj.aop.proxyaop;

import java.lang.reflect.Method;

/*

*日志类

* */

public class LoggerOperation {

public void start(Method method) {

System.out.println("日志开始Method start。。。。。");

}

public void end(Method method) {

System.out.println(" 日志结束Method end.....");

}

}

4、代理类

package sinosoft.dj.aop.proxyaop;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

public class DynaProxyHello implements InvocationHandler {

/**

* 操作者

*/

private Object proxy;

/**

* 要处理的对象(也就是我们要在方法的前后加上业务逻辑的对象,如例子中的Hello)

*/

private Object delegate;

/**

* 动态生成方法被处理过后的对象 (写法固定)

*

* @param delegate

* @param proxy

* @return

*/

public Object bind(Object delegate,Object proxy) {

this.proxy = proxy;

this.delegate = delegate;

return Proxy.newProxyInstance(this.delegate.getClass().getClassLoader(), this.delegate.getClass().getInterfaces(), this);

}

/**

* 要处理的对象中的每个方法会被此方法送去JVM调用,也就是说,要处理的对象的方法只能通过此方法调用

* 此方法是动态的,不是手动调用的

*/

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

Object result = null;

try {

//反射得到操作者的实例

Class clazz = this.proxy.getClass();

//反射得到操作者的Start方法

Method start = clazz.getDeclaredMethod("start",

new Class[] { Method.class });

//反射执行start方法

start.invoke(this.proxy, new Object[] { method });

//执行要处理对象的原本方法

result = method.invoke(this.delegate, args);

// 反射得到操作者的end方法

Method end = clazz.getDeclaredMethod("end",

new Class[] { Method.class });

// 反射执行end方法

end.invoke(this.proxy, new Object[] { method });

} catch (Exception e) {

e.printStackTrace();

}

return result;

}

}

5、测试类

package test;

import sinosoft.dj.aop.proxyaop.DynaProxyHello;

import sinosoft.dj.aop.proxyaop.Hello;

import sinosoft.dj.aop.proxyaop.IHello;

import sinosoft.dj.aop.proxyaop.LoggerOperation;

/*

* java动态代理例子 在各对象执行方法前后执行切入的日志

* */

public class TestDynproxy {

public static void main(String[] args) {

IHello hello = (IHello)new DynaProxyHello().bind(new Hello(),new LoggerOperation());

hello.sayGoogBye("Double J");

// hello.sayHello("Double J");

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: