JAVA动态代理--使用JAVA API实现JAVA动态代理
来源:互联网 发布:arm linux gcc 4.3.2 编辑:程序博客网 时间:2024/05/21 17:30
1.什么是动态代理?
答:动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实。代理一般会实现它所表示的实际对象的接口。代理可以访问实际对象,但是延迟实现实际对象的部分功能,实际对象实现系统的实际功能,代理对象对客户隐藏了实际对象。客户不知道它是与代理打交道还是与实际对象打交道。
2.为什么使用动态代理?
答:因为动态代理可以对请求进行任何处理
3.使用它有哪些好处?
答:因为动态代理可以对请求进行任何处理
4.哪些地方需要动态代理?
答:不允许直接访问某些类;对访问要做特殊处理等
目前Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。 其实现主要通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。
Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现
以下为模拟案例,通过动态代理实现在方法调用前后向控制台输出两句字符串
下面是testPorject的结构
首先定义一个DAO接口
IUserDao
package org.zhy.demo.proxy.Dao;public interface IUserDao {public void addUser(String name, int age);}
DAO接口只定义了一个addUser的方法,DAO的实现类负责实现对数据库的添加操作
IUserDaoImpl
package org.zhy.demo.proxy.Dao.Impl;import org.zhy.demo.proxy.Dao.IUserDao;public class IUserDaoImpl implements IUserDao {/** * 这里模拟数据库操作 只打印信息 */@Overridepublic void addUser(String name, int age) {System.out.println("开始添加user");System.out.println("NAME:"+name);System.out.println("AGE:"+age);System.out.println("user添加完成");}}
添加一个新的类:MyInvocationHandler
package org.zhy.demo.proxy.invocation;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * 代理类,需要实现InvocationHandler接口 * @author Administrator * */public class MyInvocationHandler implements InvocationHandler {//定义一个私有变量,被代理的对象private Object setter;public Object getSetter() {return setter;}public void setSetter(Object setter) {this.setter = setter;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {this.startProxy(); //在方法执行之前执行代理方法method.invoke(setter, args); //执行被代理对象的方法this.endProxy();//同时 在方法结束的时候也执行一下代理方法return null;}/** * 定义两个代理方法 */private void startProxy() {System.out.println("开始执行代理方法");}private void endProxy() {System.out.println("执行代理方法结束");}}
下面是具体实现:
UserService
package org.zhy.demo.proxy.service;import java.lang.reflect.Proxy;import org.zhy.demo.proxy.Dao.IUserDao;import org.zhy.demo.proxy.Dao.Impl.IUserDaoImpl;import org.zhy.demo.proxy.invocation.MyInvocationHandler;public class UserService {public static void main(String[] args) {IUserDao userDao = new IUserDaoImpl(); //实例化一个userDaoMyInvocationHandler myInvocationHandler = new MyInvocationHandler(); //实例化自己的代理类myInvocationHandler.setSetter(userDao); //被代理的对象IUserDao dao = (IUserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), myInvocationHandler); //定义一个新的代理dao.addUser("张三", 23); //执行dao的方法}}
执行结果
- JAVA动态代理--使用JAVA API实现JAVA动态代理
- Java动态代理实现
- Java动态代理实现
- JAVA动态代理实现
- Java 动态代理实现
- Java动态代理实现
- Java动态代理实现
- Java动态代理实现
- Java动态代理实现
- Java动态代理实现
- Java动态代理实现
- Java动态代理实现
- Java动态代理实现
- 动态代理--java实现
- java动态代理实现
- Java动态代理实现
- JAVA动态代理实现
- java 动态代理实现
- 无法获得锁 /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) 解决办法
- Myeclipse启动时出现Error on adding indexing context central; Unknown format version: -9错误
- Objective-c 重写 isEqual 和 hash 方法
- ttyS0: 1 input overrun(s)
- SQLServer : EXEC和sp_executesql的区别
- JAVA动态代理--使用JAVA API实现JAVA动态代理
- 菜鸟小技巧:如何在网上隐藏自己的IP地址(1)
- XML学习笔记(一)
- shell 函数的返回值和退出状态
- ConcurrentModificationException(源码学习 Util包 集合)
- arch/arm/include/asm/io.h
- 无法获得锁 /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) 解决办法
- live archive 5984 - Save the Students!
- C语言----函数和应用