为什么要写动态代理类?

例子:

  如果现在想做个登陆注册的功能。用户可以执行登陆、注册、添加、删除这些功能。

但是,有些功能是要有一定权限才可以执行的。

  而现在已经有了个用户类的接口和该类的实现类了,但里面没有添加 “权限查询”和“日志记录”这两个功能。

这个时候我不可能去改动这两个类,而且,我以后遇到类似的情况,也不想重复改动。(不想原来的类做,让别的类帮它们做)

  那么,我就可以写一个动态代理类和执行类

代码:

 A:用户的接口类

 /*
* 用户操作接口
*/
public interface UserDao {
public abstract void add(); public abstract void delete(); public abstract void update(); public abstract void find();
}

 B:用户接口的实现类(模拟功能)

 public class UserDaoImpl implements UserDao {

     public void add() {
System.out.println("添加功能");
} public void delete() {
System.out.println("删除功能");
} public void update() {
System.out.println("修改功能");
} public void find() {
System.out.println("查找功能");
} }

 C:动态代理类

/**
* 这是对实现用户操作之前的权限检查的动态代理类
*
* @author LZL
*
*/ //注意:创建这个类要实现动态代理接口 InvocationHandler
public class MyInvocationHandler implements InvocationHandler { // 无参构造接收对象
private Object target; public MyInvocationHandler(Object target) {
this.target = target;
} public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 首先执行判断权限的方法(模拟)
System.out.println("模拟判断权限");
// Object invoke(Object proxy,Method method,Object[]
// args):在代理实例上处理方法调用并返回结果。
Object ob = method.invoke(target, args);
System.out.println("模拟日志记录");
return ob; } }

 D:执行类

 public class Test {

     public static void main(String[] args) {

         // 创建UserDao的实现类对象
UserDao ud = new UserDaoImpl(); // 我们要创建一个动态代理对象
// Proxy类中有一个方法可以创建动态代理对象
// public static Object newProxyInstance(ClassLoader loader,Class<?>[]
// interfaces,InvocationHandler h) // 对ud对象做一个代理对象
MyInvocationHandler mh = new MyInvocationHandler(ud);
// 创建一个动态代理对象,本来这个方法返回的是Object类,但这里知道它所调用的代理对象的被代理者是UserDao类,所以用UserDao接收
UserDao ob = (UserDao) Proxy.newProxyInstance(ud.getClass()
.getClassLoader(), ud.getClass().getInterfaces(), mh);
// 使用代理对象所代理的类的方法
ob.add();
ob.delete();
ob.find(); System.out.println("----------------");
// 这样的话,程序就会执行动态代理类的方法,按照那顺序来。
// 如果有别的类,如Student/Teachar类,也可以这样做: StudentDao sd = new StudentDaoImpl();
// 对sd对象做个代理对象
MyInvocationHandler mh1 = new MyInvocationHandler(sd);
// 创建动态代理对象
StudentDao sd1 = (StudentDao) Proxy.newProxyInstance(sd.getClass()
.getClassLoader(), sd.getClass().getInterfaces(), mh1);
//调用方法
sd1.login();
sd1.regist(); }
}

java 27 - 10 反射之 动态代理的代码实现的更多相关文章

  1. java 27 - 9 反射之 动态代理的概述和实现

    代理:本来应该自己做的事情,却请了别人来做,被请的人就是代理对象. 举例:春季回家买票让人代买 动态代理: 在程序运行过程中产生的这个对象 而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以 ...

  2. Java基础之反射和动态代理

    1,反射是依赖于Class对象,然后根据Class对象,去操作该类的资源的.Class对象是发射的基石! 问题1:人这类事物用什么表示?汽车这类事物用什么表示>计算机文件用什么表示?有如此多的事 ...

  3. Java高级特性—反射和动态代理

    1).反射 通过反射的方式可以获取class对象中的属性.方法.构造函数等,一下是实例: 2).动态代理 使用场景: 在之前的代码调用阶段,我们用action调用service的方法实现业务即可. 由 ...

  4. 【Java EE 学习 24 下】【注解在数据库开发中的使用】【反射+注解+动态代理在事务中的应用service层】

    一.使用注解可以解决JavaBean和数据库中表名不一致.字段名不一致.字段数量不一致的问题. 1.Sun公司给jdbc提供的注解 @Table.@Column.@Id.@OneToMany.@One ...

  5. Java反射和动态代理

    Java反射 反射机制 RTTI 编译器在编译时打开和检查*.class文件 反射机制 运行时打开和检查*.class文件 Java反射常见的方法 java反射的应用 setAccessible(bo ...

  6. Java 反射 设计模式 动态代理机制详解 [ 转载 ]

    Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...

  7. Java提高班(六)反射和动态代理(JDK Proxy和Cglib)

    反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多.要怎么理解以上这句话,请看下文. 一.反射 反射机制是 Ja ...

  8. Java反射机制动态代理

    1.什么事反射机制动态代理 在一段代码的前后动态执行其他操作,比如有一个方法是往数据库添加一个记录,我们可以通过动态代理,在操作数据库方法的前和后添加代码执行打开数据库连接和关闭数据库连接. 2.演示 ...

  9. java开发必学知识:动态代理

    目录 1. 引言 2. 代理模式及静态代理 2.1 代理模式说明 2.2 静态代理 2.3 静态代理局限性 3. 动态代理 3.1 JAVA反射机制 3.2 JDK动态代理 3.2.1 JDK动态代理 ...

随机推荐

  1. [GitHub] GitHub使用教程for Eclipse

    1.下载egit插件 打开Eclipse,git需要eclipse授权,通过网页是无法下载egit的安装包的.在菜单栏依次打开eclipse→help→install new software→add ...

  2. 转:jQuery.data

    原文地址:http://www.it165.net/pro/html/201404/11922.html 内存泄露 首先看看什么是内存泄露,这里直接拿来Aaron中的这部分来说明什么是内存泄露,内存泄 ...

  3. 基于XMPP的IOS聊天客户端程序

    简介:XMPP协议是一种基于Socket长连接.以XML格式进行基本信息交换.C/S S/S多种架构的聊天协议 XMPPServer 基于XMPP协议的服务端(例如eJabber.OpenFire) ...

  4. Android Studio教程--Android项目分享到Github

    首先下载安装git 下载地址:https://git-scm.com/ 打开AS,并设置如下: 到github上面注册一个帐号 运行--cmd cd C:\Program Files\Git\bin ...

  5. python 获取星期几

    In [17]: now.strftime(%a),now.strftime(%w) Out[17]: ('Mon', '1') Directive Meaning %a Weekday name. ...

  6. 如何在linux设置回收站

    修改用户的环境变量 vi ~/.bashrc 注释第5行的别名 #alias rm='rm -i' 最后一行添加如下内容 mkdir -p ~/.trash alias rm=trash alias ...

  7. Tableau——BI software

    Tableau 8权威指南 (权威的数据可视化实战手册,中国传媒大学教授沈浩.北京大学研究员袁晓如 联袂推荐) 触手可及的大数据分析工具——Tableau案例集 写给专业数据分析师的丛书,无门槛的大数 ...

  8. day 2远程连接Linux系统管理

        IP端口-协议等基本概念 互联网上的计算机,都会有一个唯一的32位的地址,IP地址. 我们访问服务器.就必须通过这个IP地址. 局域网也有预留的IP地址 192/10/172开头.局域网的 I ...

  9. get_free_page

    /**  0.11用了 unsigned char */static unsigned short mem_map [ PAGING_PAGES ] = {0,}; /* * Get physical ...

  10. lsll 加载段限长指令

    static inline unsigned long get_limit(unsigned long segment) {  unsigned long __limit;  __asm__(&quo ...