java技术之动态代理以及AOP编程
来源:互联网 发布:sopcast网络电视成人台 编辑:程序博客网 时间:2024/06/07 05:17
写技术博客挺累的啊....总结了一下午总算是出来了~废话不多说,贴代码吧~
名词解释:
动态代理:既指类的代理对象是动态生成的,而不是有程序员预先编写好的,这里利用java反射包中的类Proxy,核心代码如下:
通过 Proxy.getProxyClass(ClassLoader loader, Class<?>... interfaces)如: Object target; Class clazz = Proxy.getClass( target.getClass().getClassLoader(), target.getClass().getInterfaces() ); Object proxyObj = clazz.newInstance();或者直接通过: Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)例如: Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new MyInvocationHandler());模拟AOP和动态代理代码片段:package com.java.enhance;import java.io.InputStream;import java.util.List;/** * 测试AOP以及动态代理 * * @author zhuoni * */public class DynamicProxyDemo {public static void main(String[] args) throws Exception {//1.读取资源文件InputStream inputStream = DynamicProxyDemo.class.getResourceAsStream("bean.properties");//2.创建beanFactory实例BeanFactory beanFactory = new BeanFactory(inputStream);List bean = (List)beanFactory.getBean("bean");bean.add("aa");}}运行结果:在目标类方法执行之前要做的内容~执行目标方法~在目标类方法执行之后要做的内容~结论: 当我们获取代理类的时候,就会生成对应的代理对象返回相关类以及接口代码:package com.java.enhance;import java.io.IOException;import java.io.InputStream;import java.util.Properties;/** * Bean工厂类 * * @author zhuoni * */public class BeanFactory {private Properties prop = new Properties();public BeanFactory(InputStream inStream){try {prop.load(inStream);} catch (IOException e) {e.printStackTrace();}}public Object getBean(String name) throws Exception{String className = prop.getProperty(name);Class beanClass = Class.forName(className);Object obj = beanClass.newInstance();//这就是为什么javabean需要一个默认的无参构造函数的原因:方便利用反射实例化//如果获取的是代理类,则获取其目标类以及切面类,创建其代理类返回if(obj instanceof ProxyFactoryBean){ProxyFactoryBean proxyBean = (ProxyFactoryBean)obj;Object target = Class.forName(prop.getProperty(name+".target")).newInstance();Advise advise = (Advise)Class.forName(prop.getProperty(name+".advise")).newInstance();proxyBean.setTarget(target);proxyBean.setAdvise(advise);obj = proxyBean.getProxy();}return obj;}}---------------------------------------------------------------------------------------------package com.java.enhance;import java.lang.reflect.Proxy;/** * 动态生成代理类的工厂类 * * @author zhuoni * */public class ProxyFactoryBean {/*被代理的类,也称为目标类*/private Object target;/*封装目标类方法执行之外所要做的操作的类*/private Advise advise;/** * 获取目标类的代理类 * * @return */public Object getProxy() {Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new MyInvocationHandler(target,advise));return proxy;}public Object getTarget() {return target;}public void setTarget(Object target) {this.target = target;}public Advise getAdvise() {return advise;}public void setAdvise(Advise advise) {this.advise = advise;}}package com.java.enhance;/** * 封装代理类所要做的内容的接口 * * * @author zhuoni * */public interface Advise {public void beforeMethod();public void afterMethod();}package com.java.enhance;public class MyAdvise implements Advise {public void beforeMethod() {System.out.println("在目标类方法执行之前要做的内容~");}public void afterMethod() {System.out.println("在目标类方法执行之后要做的内容~");}}package com.java.enhance;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * 我的InvocationHandler * * @author zhuoni * */class MyInvocationHandler implements InvocationHandler{/*被代理的类,也称为目标类*/private static Object target;/*封装目标类方法执行之外所要做的操作的类*/private static Advise advise;public MyInvocationHandler(Object target, Advise advise) {this.target = target;this.advise = advise;}public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {advise.beforeMethod();System.out.println("执行目标方法~");Object value = method.invoke(target, args);advise.afterMethod();return value;}public Object getTarget() {return target;}public void setTarget(Object target) {this.target = target;}public Advise getAdvise() {return advise;}public void setAdvise(Advise advise) {this.advise = advise;}}资源文件:bean.properties: #bean=java.util.ArrayList bean=com.java.enhance.ProxyFactoryBean bean.advise=com.java.enhance.MyAdvise bean.target=java.util.ArrayList
阅读全文0 0
- java技术之动态代理以及AOP编程
- JAVA AOP编程之动态代理技术
- Java静态代理、动态代理以及AOP
- Java动态代理之JDK动态代理和CGLib动态代理 面向切面编程AOP原理
- JAVA AOP之动态代理
- 使用Java动态代理技术实现AOP
- Java动态代理和AOP编程
- AOP编程之JDK动态代理和Cglib动态代理
- AOP编程+动态代理
- Spring AOP 之 java 动态代理基础
- Spring Boot AOP之Java 动态代理
- AOP之动态代理
- aop之动态代理
- AOP代理之动态代理
- AOP代理之动态代理
- java学习之路----静态代理---动态代理-----AOP的前奏(AOP也是动态代理)
- AOP系列之三:用Java动态代理实现AOP
- 什么是AOP系列之:用Java动态代理实现AOP
- 主力机安装VS Code记录
- 新闻数据爬虫分析
- Unity3D 屏幕空间雪场景Shader渲染
- wildfly8.2 standalone linux 部署war包指令
- 假设有n个人,每个人从1开始查数——1,2,3,查到3的人退出;从第四个人开始1,2,3插数,查到3的人退出 最终只剩一个,打印出剩下的是第几个人。
- java技术之动态代理以及AOP编程
- static_cast const_cast dynamic_cast
- 可并堆?左偏树?
- 6-Vue指令之条件渲染 V-if/else
- JAVA中字符串如何转数组
- xml用法
- 最大熵模型原理小结
- hdu 1281棋盘游戏(最大匹配)
- 数据结构复习篇之一:数据结构相关知识
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
梦见亲戚出车祸
梦见去亲戚家
梦见亲戚离婚了
亲戚的英语单词
梦见亲戚离婚
亲戚英语单词
梦见好多亲戚
梦到和亲戚吵架
梦见亲戚吃饭
梦见家里亲戚
梦见远方亲戚
亲故
十亲九故
沾亲带故
指亲托故
三亲六故
九故十亲
三亲六故指的是什么
韩语亲故是什么意思
亲昵
亲昵读音
亲昵的称呼
亲昵无间
亲昵称呼
的亲昵
亲昵弱水千
亲昵弱水千流
情侣间亲昵外号
给另一半的亲昵备注
亲昵 弱水千流
闺蜜备注前的亲昵名称
你是我无法拥有的亲昵
好听顺耳的带丽字亲昵的名字
你是我无法捕捉的亲昵
你是我永远无法捕捉的亲昵
亲朋
亲朋好友
亲朋拼音
亲朋充值
亲朋的拼音
亲朋令牌