java 27 - 10 反射之 动态代理的代码实现
为什么要写动态代理类?
例子:
如果现在想做个登陆注册的功能。用户可以执行登陆、注册、添加、删除这些功能。
但是,有些功能是要有一定权限才可以执行的。
而现在已经有了个用户类的接口和该类的实现类了,但里面没有添加 “权限查询”和“日志记录”这两个功能。
这个时候我不可能去改动这两个类,而且,我以后遇到类似的情况,也不想重复改动。(不想原来的类做,让别的类帮它们做)
那么,我就可以写一个动态代理类和执行类
代码:
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 反射之 动态代理的代码实现的更多相关文章
- java 27 - 9 反射之 动态代理的概述和实现
代理:本来应该自己做的事情,却请了别人来做,被请的人就是代理对象. 举例:春季回家买票让人代买 动态代理: 在程序运行过程中产生的这个对象 而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以 ...
- Java基础之反射和动态代理
1,反射是依赖于Class对象,然后根据Class对象,去操作该类的资源的.Class对象是发射的基石! 问题1:人这类事物用什么表示?汽车这类事物用什么表示>计算机文件用什么表示?有如此多的事 ...
- Java高级特性—反射和动态代理
1).反射 通过反射的方式可以获取class对象中的属性.方法.构造函数等,一下是实例: 2).动态代理 使用场景: 在之前的代码调用阶段,我们用action调用service的方法实现业务即可. 由 ...
- 【Java EE 学习 24 下】【注解在数据库开发中的使用】【反射+注解+动态代理在事务中的应用service层】
一.使用注解可以解决JavaBean和数据库中表名不一致.字段名不一致.字段数量不一致的问题. 1.Sun公司给jdbc提供的注解 @Table.@Column.@Id.@OneToMany.@One ...
- Java反射和动态代理
Java反射 反射机制 RTTI 编译器在编译时打开和检查*.class文件 反射机制 运行时打开和检查*.class文件 Java反射常见的方法 java反射的应用 setAccessible(bo ...
- Java 反射 设计模式 动态代理机制详解 [ 转载 ]
Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...
- Java提高班(六)反射和动态代理(JDK Proxy和Cglib)
反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多.要怎么理解以上这句话,请看下文. 一.反射 反射机制是 Ja ...
- Java反射机制动态代理
1.什么事反射机制动态代理 在一段代码的前后动态执行其他操作,比如有一个方法是往数据库添加一个记录,我们可以通过动态代理,在操作数据库方法的前和后添加代码执行打开数据库连接和关闭数据库连接. 2.演示 ...
- java开发必学知识:动态代理
目录 1. 引言 2. 代理模式及静态代理 2.1 代理模式说明 2.2 静态代理 2.3 静态代理局限性 3. 动态代理 3.1 JAVA反射机制 3.2 JDK动态代理 3.2.1 JDK动态代理 ...
随机推荐
- 让你的APK瘦成一道闪电
APK瘦身是长久以来的难题,我们需要通过一些工具和技巧才能让它瘦下去,下面我来分享一下我在apk瘦身方面的经验. 一.apk中有哪些东西 1.代码 2.lib 3.so本地库 4.资源文件(图片,音频 ...
- Android实现登录
登录界面布局文件 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android ...
- Android JNI简介
JNI简介 JNI (Java Native Interface),Java的本地接口 JNI是Java众多开发技术中的一门,意在利用本地代码,为Java程序提供 更高效,更灵活的拓展.应用场景包括: ...
- 【代码笔记】iOS-平面化的饼图
一,效果图. 二,工程图. 三,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additi ...
- Mac OS 文件、文件夹重命名的方法
在Mac OS中,文件和文件名重命名的方法非常简单 选中你想要命名的文件或者文件夹,按回车,可以直接重命名,输入你要修改的内容,确认后,再按回车就OK啦--- 希望能对你有所帮助^_^
- 转:无法向会话状态服务器发出会话状态请求请。确保 ASP.NET State Service (ASP.NET 状态服务)已启动
今天看到一篇文章感觉不错,收藏转载下. 原文地址:http://blog.csdn.net/sntyy/article/details/2090347 版权为原作者所有 无法向会话状态服务器发出会话状 ...
- (转) 一步一步学习ASP.NET 5 (四)- ASP.NET MVC 6四大特性
转发:微软MVP 卢建晖 的文章,希望对大家有帮助.原文:http://blog.csdn.net/kinfey/article/details/44459625 编者语 : 昨晚写好的文章居然csd ...
- ArrayList
各种原因,前两年做C语言去了,现在重新做JAVA, 感觉自己基础很不扎实,要好好学习啦, 先从简单的开始~ 以下内容基于jdk1.7.0_79源码: 什么是ArrayList 可以简单的认为是一个动态 ...
- PMBOK(第五版)学习笔记二-十大知识领域(P87)
五大项目管理过程组:启动.规划.执行.监控.收尾过程组 十大知识领域是:项目整合管理.项目范围管理.项目时间管理.项目成本管理.项目质量管理.项目人力资源管理.项目沟通管理.项目风险管理.项目采购管理 ...
- 关于update set from where
http://blog.csdn.net/xcbsdu/article/details/6736503 下面是这样一个例子: 两个表a.b,想使b中的memo字段值等于a表中对应id的name值 ...