AOP的JDK动态代理实现
2017-12-13 23:43
183 查看
AOP(Aspect Oriented Programming)面向切面编程,技术利用“横切”的方式,通过减少系统的重复代码,降低模块间的耦合度,达到可重用的目的,有利于未来的可操作性和可维护性。
通常用途:日志记录,性能统计,安全控制,事务处理,异常处理等。
动态代理
JDK的java.lang.reflect包下的Proxy类就是构造代理的入口。
这段源代码就是创建代理对象的方法:loader 指被代理类加载; interfaces指被代理的类接口;h被代理的类的最终目标
1、代理接口
2、接口实现(被代理的目标类)
3、代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @ClassName EatAop
* @author Cheng.Wei
* @date 2017年12月13日 下午10:48:12
* {@link java.lang.reflect.InvocationHandler}
*/
public class EatAop implements InvocationHandler {
private Object target;
public EatAop(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("有人吃东西了");
//对吃鱼的人进行记录
if(method.getName().equals("bread")) {
System.out.println("面包被吃了 !!!");
}
return method.invoke(target, args);
}
}
4、测试
import java.lang.reflect.Proxy;
/**
* @ClassName Listener
* @author Cheng.Wei
* @date 2017年12月13日 下午10:53:54
*
*/
public class Listener {
public static void main(String[] args) {
// 被代理类
ClassLoader classLoader = EatImpl.class.getClassLoader();
// 被代理的接口
Class[] proxyInterface = new Class[] { Eat.class };
// 被代理的类的最终目标
EatAop eatAop = new EatAop(new EatImpl());
Eat eat = (Eat) Proxy.newProxyInstance(classLoader, proxyInterface, eatAop);
eat.milk("张三");
System.out.println("============");
eat.bread("李四");
}
}
执行结果
通常用途:日志记录,性能统计,安全控制,事务处理,异常处理等。
动态代理
JDK的java.lang.reflect包下的Proxy类就是构造代理的入口。
这段源代码就是创建代理对象的方法:loader 指被代理类加载; interfaces指被代理的类接口;h被代理的类的最终目标
1、代理接口
/** * @ClassName Eat * @Description (吃) 提供的服务 牛奶 面包 * @author Cheng.Wei * @date 2017年12月13日 下午10:43:23 * */ public interface Eat { void milk(String name); void bread(String name); }
2、接口实现(被代理的目标类)
/** * @ClassName EatImpl * @Description TODO(这里用一句话描述这个类的作用) * @author Cheng.Wei * @date 2017年12月13日 下午10:44:41 * */ public class EatImpl implements Eat{ /* (non-Javadoc) * @see org.dhweicheng.Eat#milk(java.lang.String) */ @Override public void milk(String name) { System.out.println(name + "喝牛奶"); } /* (non-Javadoc) * @see org.dhweicheng.Eat#bread(java.lang.String) */ @Override public void bread(String name) { System.out.println(name + "吃面包"); }
3、代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @ClassName EatAop
* @author Cheng.Wei
* @date 2017年12月13日 下午10:48:12
* {@link java.lang.reflect.InvocationHandler}
*/
public class EatAop implements InvocationHandler {
private Object target;
public EatAop(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("有人吃东西了");
//对吃鱼的人进行记录
if(method.getName().equals("bread")) {
System.out.println("面包被吃了 !!!");
}
return method.invoke(target, args);
}
}
4、测试
import java.lang.reflect.Proxy;
/**
* @ClassName Listener
* @author Cheng.Wei
* @date 2017年12月13日 下午10:53:54
*
*/
public class Listener {
public static void main(String[] args) {
// 被代理类
ClassLoader classLoader = EatImpl.class.getClassLoader();
// 被代理的接口
Class[] proxyInterface = new Class[] { Eat.class };
// 被代理的类的最终目标
EatAop eatAop = new EatAop(new EatImpl());
Eat eat = (Eat) Proxy.newProxyInstance(classLoader, proxyInterface, eatAop);
eat.milk("张三");
System.out.println("============");
eat.bread("李四");
}
}
执行结果
相关文章推荐
- Java JDK 动态代理(AOP)使用及实现原理分析
- Spring之AOP的实现(JDK动态代理:只能代理接口,不能代理类)
- Java反射之JDK动态代理实现简单AOP
- Spring AOP实现方式 - JDK动态代理和CGLIB动态代理
- AOP的底层实现-CGLIB动态代理和JDK动态代理
- Spring AOP的底层实现技术---JDK动态代理
- AOP的底层实现-CGLIB动态代理和JDK动态代理
- Spring中AOP实现的两种方式之JDK和cglib的动态代理
- 从JDK动态代理看Spring之AOP实现(转帖)
- Java反射之JDK动态代理实现简单AOP
- 利用JDK的中Proxy动态代理实现Spring的AOP技术
- Spring Aop 中的JDK动态代理的实现
- AOP的底层实现-CGLIB动态代理和JDK动态代理
- AOP的底层实现--JDK动态代理,CGLIB动态代理
- aop学习总结一------使用jdk动态代理简单实现aop功能
- AOP的底层实现-CGLIB动态代理和JDK动态代理
- AOP的底层实现-CGLIB动态代理和JDK动态代理
- JDK核心API:使用动态代理实现AOP功能
- Java JDK 动态代理(AOP)使用及实现原理分析
- Spring AOP的底层实现技术---JDK动态代理