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动态代理 ...
随机推荐
- linux集群运维工具:clustershell和pssh
由于需要安装hadoop集群,有10台机器需要安装,一开始打算用SCP复制,后来觉得不可接受(实际现场可能数倍的机器集群,就是10台也不想干).后来在网上找了,发现了clustershell和pssh ...
- 解决方案:带格式化文本控件( RichText)的模板如果在InfoPath的浏览器中加载可能出现 COM 组件的80040154错误
建议大家在微软的组件出现问题时,在GOOGLE上搜索解决方案,一般来说,总有结果: 带格式化文本控件( RichText)的模板如果在InfoPath的浏览器中加载,可能出现 COM 组件的80 ...
- Android实现登录
登录界面布局文件 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android ...
- Android图表类库:WilliamChart
WilliamChart是基于Views的Android图表类库,帮助开发者在Android应用中实现折线图.柱状图和堆叠柱状图.数值发生变化时图表也会以动画的效果发生变化. At the momen ...
- 面试题:“你能不能谈谈,java GC是在什么时候,对什么东西,做了什么事情?”
面试题目:地球人都知道,Java有个东西叫垃圾收集器,它让创建的对象不需要像c/cpp那样delete.free掉,你能不能谈谈: GC是在什么时候,对什么东西,做了什么事情? 以上算是三个问题,下面 ...
- 【代码笔记】iOS-3个section,每个都有header.
一,效果图: 二,工程目录. 三,代码 RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...
- socket编程中客户端常用函数 以及简单实现
1 常用函数 1.1 connect() int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen); 客 ...
- jQuery删除节点和追加节点
for (var i in checkedBoxIds) { var $td = $("#" + checkedBoxIds[i]).parent().parent().detac ...
- 使用Gradle构建构建一个Java Web工程及持续集成环境Jenkins配置
安装Eclipse插件——Buildship 什么是Buildship? Buildship能方便我们通过Eclipse IDE创建和导入Gradle工程,同时还能执行Gradle任务. Eclips ...
- 10个关于Java异常的常见问题
这篇文章总结了十个经常被问到的JAVA异常问题: 1.检查型异常VS非检查型异常 简单的说,检查型异常是指需要在方法中自己捕获异常处理或者声明抛出异常由调用者去捕获处理: 非检查型异常指那些不能解决的 ...