摘自http://baike.baidu.com/view/3454964.htm#5

反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。

Java中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是:如果使用不当,反射的成本很高。

最近在成都写一个移动增值项目,俺负责后台server端。功能很简单,手机用户通过GPRS打开Socket与服务器连接,我则根据用户传过来的数据做出响应。做过类似项目的兄弟一定都知道,首先需要定义一个类似于MSNP的通讯协议,不过今天的话题是如何把这个系统设计得具有高度的扩展性。由于这个项目本身没有进行过较为完善的客户沟通和需求分析,所以以后肯定会有很多功能上的扩展,通讯协议肯定会越来越庞大,而我作为一个不那么勤快的人,当然不想以后再去修改写好的程序,所以这个项目是实践面向对象设计的好机会。

  首先定义一个接口来隔离类:

  package org.bromon.reflect;

  public interface Operator{

  public java.util.List act(java.util.List params)

  }

  根据设计模式的原理,我们可以为不同的功能编写不同的类,每个类都继承Operator接口,客户端只需要针对Operator接口编程就可以避免很多麻烦。比如这个类:

  package org.bromon.reflect.*;

  public class Success implements Operator{

  public java.util.List act(java.util.List params){

  List result=new ArrayList();

  result.add(new String(“操作成功”));

  return result;

  } } 我们还可以写其他很多类,但是有个问题,接口是无法实例化的,我们必须手动控制具体实例化哪个类,这很不爽,如果能够向应用程序传递一个参数,让自己去选择实例化一个类,执行它的act方法,那我们的工作就轻松多了。

  很幸运,我使用的是Java,只有Java才提供这样的反射机制,或者说内省机制,可以实现我们的无理要求。编写一个配置文件emp.properties:

  #成功响应

  1000=Success

  #向客户发送普通文本消息

  2000=Load

  #客户向服务器发送普通文本消息

  3000=Store

  文件中的键名是客户将发给我的消息头,客户发送1000给我,那么我就执行Success类的act方法,类似的如果发送2000给我,那就执行Load类的act方法,这样一来系统就完全符合开闭原则了,如果要添加新的功能,完全不需要修改已有代码,只需要在配置文件中添加对应规则,然后编写新的类,实现act方法就ok,即使我弃这个项目而去,它将来也可以很好的扩展。这样的系统具备了非常良好的扩展性和可插入性。 下面这个例子体现了动态加载的功能,程序在执行过程中才知道应该实例化哪个类:

  package org.bromon.reflect.*;

  import java.lang.reflect.*;

  public class TestReflect{

  //加载配置文件,查询消息头对应的类名

  private String loadProtocal(String header){

  String result=null;

  try{

  Properties prop=new Properties();

  FileInputStream fis=new FileInputStream("emp.properties");

  prop.load(fis);

  result=prop.getProperty(header);

  fis.close();

  }catch(Exception e){

  System.out.println(e);

  }

  return result; }

  //针对消息作出响应,利用反射导入对应的类

  public String response(String header,String content) {

  String result=null; String s=null;

  try {

  /* * 导入属性文件emp.properties,查询header所对应的类的名字

  * 通过反射机制动态加载匹配的类,所有的类都被Operator接口隔离

  * 可以通过修改属性文件、添加新的类(继承MsgOperator接口)来扩展协议

  */

  s="org.bromon.reflect."+this.loadProtocal(header);

  //加载类 Class c=Class.forName(s);

  //创建类的事例

  Operator mo=(Operator)c.newInstance();

  //构造参数列表

  Class params[]=new Class[1];

  params[0]=Class.forName("java.util.List");

  //查询act方法

  Method m=c.getMethod("act",params);

  Object args[]=new Object[1];

  args[0]=content;

  //调用方法并且获得返回

  Object returnObject=m.invoke(mo,args);

  }catch(Exception e){

  System.out.println("Handler-response:"+e);

  }

  return result;

  }

  public static void main(String args[]){

  TestReflect tr=new TestReflect(); tr.response(args[0],”消息内容”);

  } }

  测试一下:java TestReflect 1000 这个程序是针对Operator编程的,所以无需做任何修改,直接提供Load和Store类,就可以支持2000、3000做参数的调用。

  有了这样的内省机制,可以把接口的作用发挥到极至,设计模式也更能体现出威力,而不仅仅供我们饭后闲聊。

转载于:https://www.cnblogs.com/wanping/archive/2012/04/13/2446273.html

[java学习] java_反射机制相关推荐

  1. Java 学习之反射机制“解刨”分解类,并获取内容!

    正常情况下,单纯的做开发是接触不到反射机制的(额,当然并不排除例外的情况了).下面我就对我学到的反射方面的知识做一个小小的总结,旨在复习和以后的查看. 原理分析: 所谓反射就是将一个类当做我们研究的对 ...

  2. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  3. JAVA_反射机制(照镜子)

    反射 首先反射,当你照镜子的时候你的面部的个个部位都会通过镜子反射出来,让你看道你自己.而JAVA也会像我们一样,也有一面镜子,它可以通过这面镜子,看到自己的一些信息.JAVA反射机制就是对于一段程序 ...

  4. Java反序列化之反射机制

    目录 前言 Java反射机制 反射机制方法 指定构造方法生成实例 执行私有方法 总结 前言 每次听到大佬在讲或者看论坛等一些方式学java反序列化漏洞时,都会有一个词叫做反射机制,大佬顺势借着这个词, ...

  5. Java中的反射机制详讲

    Java中的反射机制详讲 1.反射机制_介绍_Class对象获取 2.反射机制_动态操作_构造器_方法_属性 3.动态编译_DanamicCompile_反射调用main方法问题 好文推荐:排序.查找 ...

  6. JAVA基础--JAVA中的反射机制详解

    JAVA反射机制     JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能 ...

  7. java 有哪些反射机制_Java 的反射机制你了解多少?

    不知道多少次听说过了Java反射机制的使用,比如:Spring 框架如何实例化IoC容器中的Bean,编码过程中如何动态的清理对象中的字段信息等等.工作中只是听说.看同事们编码实践,但是自己却只是概念 ...

  8. java代码安全检测机制_全面解析:java中的反射机制,内含代码验证解析

    什么是反射? 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功 ...

  9. 根据实例详解Java中的反射机制

    概念: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java ...

最新文章

  1. django 添加comments app
  2. 【转载】请问Silverlight 获取客户端网卡mac码
  3. android11beta支持什么手机,Android 11 Beta1发布,新增多种功能,网友:Android基于 Flyme...
  4. codeforces contest 1119
  5. 从零开始的全栈工程师——html篇1.6
  6. Linux环境Elasticsearch6.xxx 之kibana可视化工具操作索引
  7. 机器学习之特征工程-特征选择
  8. spdlog linux编译出错,Linux下编写Makefile引入第三方库
  9. 数据结构与算法——二叉树与图汇总整理
  10. 凑零钱动态规划java_动态规划巧解凑零钱问题 | 创作者训练营
  11. 蓝桥每日真题之负载均衡
  12. python open 函数漏洞_Python系列之——编写已知漏洞exp实现批量getshell
  13. 读JDK动态代理源码(Proxy类)
  14. 手摸手深入理解JVM虚拟机--在MacOS系统上编译OpenJDK12并使用CLion调试靠谱教程
  15. 吴恩达机器学习笔记目录
  16. All matches were filtered out by modular filtering for argument: mysql-community-server
  17. 伏羲六十四卦+36D
  18. python大数据运维工程师待遇_什么是大数据运维工程师
  19. 信息隐藏——DCT隐写
  20. 清理Maven本地仓库.lastUpdated文件

热门文章

  1. html5 本地文件操作系统,读取目录 - createReader《 HTML5:文件系统 》
  2. centos8搭建nsis交叉编译环境
  3. Go 都在什么时候触发GC,能手动触发GC吗?
  4. Windows系统中常见的进程DOS操作命令
  5. idea中查看maven信息
  6. 日志服务与SIEM(如Splunk)集成方案实战 1
  7. 利用WPF建立自己的3d gis软件(非axhost方式)(九)SDK自带部分面板的调用
  8. GDI对象泄漏检查的一点经验
  9. MySQL中AES_ENCRYPT('密码','钥匙')函数 可以对字段值做加密处理
  10. Ray.Xu 写得 RTEMS 介绍(最新版本,全面,覆盖了CVS Head)