java动态代理
来源:互联网 发布:ibeer free软件可乐 编辑:程序博客网 时间:2024/06/05 19:41
在学Spring时,又提到了AOP面向切面(Aspects-Oriental-Programming)
其实它的原理就是动态代理,只是Spring帮我们封装起来了
JDK的动态代理主要是用到类:java.lang.reflect中的InvocationHandler接口与Proxy类
实现接口InvocationHandler,实现方法invoke这个方向影射时就有提过了
实现时调用Proxy的newProxyInstance方法进行代理
以用户操作为例,照样画葫芦装一下逼,由于只是装逼,所以没有进model层,怕麻烦。。
首先弄个接口UserDao.java
package com.proxy.dao;public interface UserDao {public void delete();public void save();public void load();public void update();}然后就是实现接口的UserImplt
package com.proxy.implt;import com.proxy.dao.UserDao;public class UserImplt implements UserDao {@Overridepublic void delete() {System.out.println("delete!!");}@Overridepublic void save() {System.out.println("save success!!");}@Overridepublic void load() {System.out.println("load user");}@Overridepublic void update() {System.out.println("update success!!!");}}搞个代理工厂Dynamic_proxy_factory,这里就是中心代码了实现了InvocationHandler接口,重写方法Invoke,这里我定义了个重复加载的方法printTime用于打印每个方法执行的时间
</pre><pre name="code" class="java">public class Dynamic_proxy_factory implements InvocationHandler {private Object target;public Object getTarget() {return target;}public void setTarget(Object target) {this.target = target;}public static void printTime(Method method){SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式System.out.println("Method run time:" + method.getName() + df.format(new Date()));// new Date()为获取当前系统时间)}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stubprintTime(method);method.invoke(target, args);return null;}}来个Test来测试一下UserTest
import java.lang.reflect.Proxy;import com.proxy.dao.UserDao;import com.proxy.factory.Dynamic_proxy_factory;import com.proxy.implt.UserImplt;public class UserTest {/** * @param args */public static void main(String[] args) {Test_1();}private static void Test_1(){UserDao userDao = new UserImplt();//原来的业务逻辑Dynamic_proxy_factory dpf = new Dynamic_proxy_factory();//new 一个代理工厂dpf.setTarget(userDao);//把原来的逻辑交给代理UserDao userProxy = (UserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), dpf);
<span style="white-space:pre"></span>//产生一个代理对象userProxy.delete();userProxy.save();userProxy.update();}运行结果:
到这里就完成了JDK动态代理的过程,它帮我们减少了重复代码的问题,达成了松偶合,AOP的思想实在。。。。。。还得学习。。。
0 0
- Java 代理,动态代理
- [Java] Java 动态代理
- java代理及动态代理
- java代理模式--动态代理
- Java静态代理、动态代理
- Java 代理之 动态代理
- Java 代理与动态代理
- java静态代理,动态代理
- 代理模式&java动态代理
- Java代理与动态代理
- Java静态代理动态代理
- JAVA代理模式--动态代理
- java 代理和动态代理
- JAVA动态代理 代理模式
- Java动态代理--jdk代理
- Java动态代理--cglib代理
- Java 代理与动态代理
- java代理模式-动态代理
- 20155.18安卓笔记之ContentProvider
- Java通过jdbc直接连接access数据库
- 特征值与特征向量:信号处理中的应用
- iOS学习系列——获取位置信息
- Linux cron job 详解
- java动态代理
- 感谢以及抱歉
- 文章标题
- maven的resources插件
- jquery 里面对数组操作-去重
- Ubuntu 中出现username is not in the sudoers file. This incident will be reported的错误
- 完美解决 Linux 下 Sublime Text 中文输入
- android的五大存储方式
- 二叉树中和为某一值的路径