- 浏览: 979106 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
探讨Java代理模式与反射机制的实际应用(1)
-
Java的代理模式和反射机制,相信Java的开发者们都非常熟悉,文章会通过一个实例,深入探讨代理模式与Java反射机制的实际应用。
Java 提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫反射。而代理模式是为其他对象提供一种代理以控制对这个对象的访问,让我们的目标类和代理类实现同一接口,在代理类中调用目标类对象的方法。
反射机制 是如今很多Java流行框架的实现基础,其中包括Spring 、Hibernate 等。如果我们将反射机制加入到Java的代理模式中,就可以实现一个公共的代理类,省去我们不少功夫。
- import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;
- /**
- * 方法代理类
- * @author rongxinhua
- *
- */
- public class MethodProxy {
- private Class clazz; //对象所属的类
- private Object target; //目标对象
- private Method method; //目标方法
- private Object[] params; //参数数组
- @SuppressWarnings("unchecked")
- public MethodProxy(Object target, String methodName, Object ... params) {
- rebindTarget(target, methodName, params); //设置目标对象与方法
- }
- /**
- * 重新设置目标对象与方法
- * @param target
- * @param methodName
- * @param params
- */
- public void rebindTarget(Object target, String methodName, Object ... params) {
- this.target = target;
- this.clazz = target .getClass();
- rebindMethod(methodName, params); //设置目标方法
- }
- /**
- * 重新设置目标方法
- * @param methodName
- * @param params
- */
- public void rebindMethod(String methodName, Object ...params) {
- this.params = params;
- int paramLength = params .length;
- Class[] paramTypes = new Class[paramLength];
- for(int i = 0 ; i < paramLength ; i ++ ) {
- paramTypes[i] = params[i].getClass();
- }
- try {
- this.method = clazz .getMethod(methodName, paramTypes);
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- }
- }
- /**
- * 动态调用已绑定的方法
- */
- public void doMethod() {
- try {
- this.method.invoke(target, params);
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- }
- }
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- /**
- * 方法代理类
- * @author rongxinhua
- *
- */
- public class MethodProxy {
- private Class clazz; //对象所属的类
- private Object target; //目标对象
- private Method method; //目标方法
- private Object[] params; //参数数组
- @SuppressWarnings("unchecked")
- public MethodProxy(Object target, String methodName, Object ... params) {
- rebindTarget(target, methodName, params); //设置目标对象与方法
- }
- /**
- * 重新设置目标对象与方法
- * @param target
- * @param methodName
- * @param params
- */
- public void rebindTarget(Object target, String methodName, Object ... params) {
- this.target = target;
- this.clazz = target .getClass();
- rebindMethod(methodName, params); //设置目标方法
- }
- /**
- * 重新设置目标方法
- * @param methodName
- * @param params
- */
- public void rebindMethod(String methodName, Object ...params) {
- this.params = params;
- int paramLength = params .length;
- Class[] paramTypes = new Class[paramLength];
- for(int i = 0 ; i < paramLength ; i ++ ) {
- paramTypes[i] = params[i].getClass();
- }
- try {
- this.method = clazz .getMethod(methodName, paramTypes);
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- }
- }
- /**
- * 动态调用已绑定的方法
- */
- public void doMethod() {
- try {
- this.method.invoke(target, params);
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- }
- }
- 这样就可以实现动态地调用某个对象的某个方法了,写个测试代码如下:
- public class Manager {
- public void say() {
- System.out.println("Nobody say nothing");
- }
- public void love(String boy, String girl) {
- System.out.println(boy + " love " + girl);
- }
- }
- public class Manager {
- public void say() {
- System.out.println("Nobody say nothing");
- }
- public void love(String boy, String girl) {
- System.out.println(boy + " love " + girl);
- }
- }
我们通过代理类来调用Manager类中的say()和love()方法,测试代码如下:
- Manager man = new Manager(); //目标对象
- MethodProxy proxy = new MethodProxy(man, "say"); //方法代理对象
- proxy.doMethod(); //调用被代理的方法
- proxy.rebindMethod("love", "Tom", "Marry"); //重新绑定方法
- proxy.doMethod(); //调用被代理的方法
- Manager man = new Manager(); //目标对象
- MethodProxy proxy = new MethodProxy(man, "say"); //方法代理对象
- proxy.doMethod(); //调用被代理的方法
- proxy.rebindMethod("love", "Tom", "Marry"); //重新绑定方法
- proxy.doMethod(); //调用被代理的方法
探讨Java代理模式与反射机制的实际应用(2)
-
Java的代理模式和反射机制,相信Java的开发者们都非常熟悉,文章会通过一个实例,深入探讨代理模式与Java反射机制的实际应用。
这样就实现了动态代理调用对象的方法,上面代码输出结果就不贴出来了。如果要设置前置通知和后置通知等功能,也很容易实现,只需在“proxy.doMethod()”代码处的前面和后面设置即行。扩展应用:我们在上面的MethodProxy类中加入以下方法:
- /**
- * 获取方法上的注解
- * @param anClazz 注解类
- * @return
- */
- public Annotation getAnnotation(Class anClazz) {
- return this.method.getAnnotation(anClazz);
- }
- /**
- * 获取方法上的注解
- * @param anClazz 注解类
- * @return
- */
- public Annotation getAnnotation(Class anClazz) {
- return this.method.getAnnotation(anClazz);
- }
这个方法用来读取方法上的注解(Annotation),有什么用呢?我们写一个注解来测试下。
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- @interface Low {
- int boyAge();
- int girlAge();
- }
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- @interface Low {
- int boyAge();
- int girlAge();
- }
我们要引进Annotation相关的类:
- import java.lang.annotation.Annotation;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- import java.lang.annotation.Annotation;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
我们另外写一个测试用的业务类:
- public class LoveManager {
- @Low( boyAge = 12 , girlAge = 10 )
- public void beAbleToLove(Person boy, Person girl) {
- System.out.println(boy.getName() + " is able to love " + girl.getName());
- }
- }
- public class Person {
- private String name;
- private int age;
- public Person(String name, int age) {
- this.name = name;
- this.age = age;
- }
- //getter方法略
- }
- public class LoveManager {
- @Low( boyAge = 12 , girlAge = 10 )
- public void beAbleToLove(Person boy, Person girl) {
- System.out.println(boy.getName() + " is able to love " + girl.getName());
- }
- }
- public class Person {
- private String name;
- private int age;
- public Person(String name, int age) {
- this.name = name;
- this.age = age;
- }
- //getter方法略
- }
接写上例中的proxy对象测试代码:
- LoveManager loveManager = new LoveManager();
- Person boy = new Person("Tom", 13);
- Person girl = new Person("Marry", 10);
- proxy.rebindTarget(loveManager, "beAbleToLove", boy, girl); //重新绑定对象和方法
- Low low = (Low)proxy.getAnnotation(Low.class);
- if(boy.getAge() < low.boyAge ()) {
- System.out.println(boy.getName() + "还不到法定年龄,不能谈恋爱!");
- } else if(girl.getAge() < low.girlAge ()) {
- System.out.println(girl.getName() + "还不到法定年龄,不能谈恋爱!");
- } else {
- proxy.doMethod();
- }
- LoveManager loveManager = new LoveManager();
- Person boy = new Person("Tom", 13);
- Person girl = new Person("Marry", 10);
- proxy.rebindTarget(loveManager, "beAbleToLove", boy, girl); //重新绑定对象和方法
- Low low = (Low)proxy.getAnnotation(Low.class);
- if(boy.getAge() < low.boyAge ()) {
- System.out.println(boy.getName() + "还不到法定年龄,不能谈恋爱!");
- } else if(girl.getAge() < low.girlAge ()) {
- System.out.println(girl.getName() + "还不到法定年龄,不能谈恋爱!");
- } else {
- proxy.doMethod();
- }
这就实现了,通过Java的反射机制来读取Annotation的值,并根据Annotation的值,来处理业务数据有效性的判断,或者面向切面 动态地注入对象,或者作日志、拦截器等等。这种用法在所多框架中都常常看到, 我们在开发自己的Java组件时,不妨也采用一下吧!
【编辑推荐】
相关推荐
Java多线程并发机制的应用探讨
Java多线程并发机制的应用探讨.pdf
在此基础上,本文对SSH框架和jQuery技术在Java-Web开发中的应用进行了探讨。同时,本文结合时代技术发展的特点,对基于SSH框架的Java-Web数据库配置设计方法进行了研究,并对基于jQuery技术的Java-Web功能优化设计方法...
为能和大家能共同探讨"设计模式",我将自己在学习中的心得写下来,只是想帮助更多 人更容易理解GoF 的《设计模式》。由于原著都是以C++为例, 以Java 为例的设计模式 基本又都以图形应用为例,而我们更关心Java 在中间件...
本书通过一个完整的Java项目对经典著作Design Patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个模式的重要特征,并...
Java源码分析:深入探讨Iterator模式
《java设计模式(第2版)》适合各个层次的java开发人员与设计人员阅读,也可以作为学习java与设计模式的参考读物或教材。 目录: 第1章 绪论 1 第2章 接口型模式介绍 8 第3章 适配器(adapter)模式 13 第4章 外观(facade...
资源名称:Java脚本编程:语言框架与模式内容简介:《Sun公司核心技术丛书·Java脚本编程语言、框架与模式》讲解了脚本语言的基本概念和使用方法,概括了Java开发人员可以使用的解决方案,并探讨了在Java应用程序中...
云计算应用服务模式探讨 云计算应用服务模式探讨
JAVA的异常处理机制探讨,java日常处理技术与在设计中的应用
Java事件处理机制教学方法探讨.pdf
垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变。垃圾收集的目的在于清除不再...
探讨计算机软件开发的JAVA编程语言应用 (1).pdf
计算机软件开发的Java编程语言应用探讨.pdf
探讨Java、JavaApplet与Java Script间方法与变量的互访.pdf
Java教学中事件处理机制的探讨.pdf
java观察者模式的实例代码。从最简单的实例开始,到观察者模式。有什么问题可以加扣扣共同探讨
深入探讨 Java 类加载器.wps深入探讨 Java 类加载器.wps深入探讨 Java 类加载器.wps
施工企业协同创新模式与实现机制探讨.doc
Java语言多线程技术及应用探讨.kdh Java语言多线程技术及应用探讨.kdh