什么时候使用Reflection:

在java语言中,创建一个类的对象通常使用new operator,但是如果预先不知道类名,类名是在程序运行过程中通过参数传递过来,就没法使用这种方法了,这种情况下就只能使用Reflection机制了。

使用 Reflection机制可以大大提高程序的可扩展性和可维护性(动态创建类名),所付出的代价是效率的降低。

原理:

当我们编译一个新创建的类就会产生一个对应Class(注意:是一个类,而不是class关键字)对象,并且这个Class对象会被保存在同名.class文件里。

Reflection机制最常用于struts机制。

*** struts是开源软件。使用Struts的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。

*** MVC架构:

l  Jsp----->view(视图)

l  Servlet------>Cotroller(控制)

l  JavaBean------->Model(模型)

使用步骤:

1。获得Class的object。有三种方法:

1.Class aClassObj = a.getClass();

2.Class aClassObj = a.class();

3.Class aClassObj = Class.forName( "a" );

2。由于new操作会调用到constructor,所以第二步是获得constructor的object。有以下两个方法:

1.Constructor cons = aClassObj.getConstructor(

Class[] );

2.Constructor[] cons = aClassObj.getConstructors();

其中1中的Class[]中的每一个成员都是用来描述constructor中的参数类型的Class

object。如:假如在类a中有形如constructor(

String str , OutputStream out )的constructor,那么得到它的Constructor

object的方法就是

Class[] paraType = new Class [ 2 ];

paraType[ 0 ] = String.class;

paraType[ 1 ] = OutputStream.class;

Constructor cons = aClassObj.getConstructor ( paraType );

假如想利用无参constructor来获得一个Constructor的object,就要使用Constructor

cons = aClassObj.newInstance()方法。

3。获得该类实例

public

Object aObject()

{

Object[] paraObjArr = new Object[2];

Object[ 0 ] = "name";

Object[ 1 ] = new OutputStream ( "text.txt" );

return cons.newInstance ( paraObjArr )

}

4。获得该类中的方法。有以下两种方式:

1. 使用Method

allMethod []= aClassObj.getDeclaredMethods()可以得到所有该类中的方法的对象

2.使用getMethod(参数)可以获得某个具体的方法,其中参数同获取构造函数时类似,需要paraType。假如有一个名为"setName"具有一个String类型的参数的方法,可以这样使用:

Class[] methodParaType = new Class[ 1 ];

methodParaType [0] = String.class;

Method gotmethod = aClassObj.getMethod( "setName" ,methodParaType

);

5。使用该类中的方法。接着上例:

Object[]

methodPara = new Object[1];

methodPara[0] = "wang";

gotmethod.invoke( cons.newInstance ( paraObjArr

),methodPara

);

例:

import java.ang.reflect.*;

public classDumpMethods{

public

static void main (String args[]){

try{

Class c = Class.forName(args[0]);

Method m[] =

c.getDeclaredMethods();

for(int i = 0;

i < m.length; i++)

System.out.println(m[i].toString());

} catch (Throwable e){

System.err.println(e);

}

}

}

按如下语句执行:

java DumpMethods java.utilStack

它的结果为:

public java.lang.Object

java.util.Stack.push(java.lang.Object)

public synchronized java.lang.Object

ava.util.Stack.pop()

public synchronized java.lang.Object

java.util.Stack.peek()

public boolean

java.util.Stack.empty()

public synchronized int

java.util.Stack.search(java.lang.Object)

分析:

这个程序使用Class.forName载入指定的类,然后调用getDeclaredMethods来获取这个类中定义了的方法列表。另外getDeclaredField()可以获得类的字段域、getDeclaredConstructors()可以获得类的构造函数。

java的reflection机制_Java的Reflection机制相关推荐

  1. java spi机制_Java 双亲委派机制的破坏—SPI机制

    作者:程序猿微录 出自:TinyRecord 原文:tinyice.cn/articles/123 Java 双亲委派机制的破坏-SPI机制 在Java的类加载机制中,默认的就是双亲委派机制,这种委派 ...

  2. java tcp 心跳机制_Java实现心跳机制的方法

    一.心跳机制简介 在分布式系统中,分布在不同主机上的节点需要检测其他节点的状态,如服务器节点需要检测从节点是否失效.为了检测对方节点的有效性,每隔固定时间就发送一个固定信息给对方,对方回复一个固定信息 ...

  3. java 强制垃圾回收_Java垃圾回收机制

    Java垃圾回收机制 垃圾回收机制用到finalize.当程序创建对象.数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存中,当这块内存不再被任何引用变量引用时,这块内存 ...

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

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

  5. java垃圾回收菜鸟_java垃圾回收机制

    1:对象可能不被垃圾回收 2:垃圾回收并不等于"析构" 3:垃圾回收只与内存有关,为了回收程序不再使用的内存 java虚拟机采用了"自适应"的垃圾回收机制,即& ...

  6. java 判断object类型_Java 类继承机制

    封装.继承.多态是面向对象的三大特征,"继承"最主要的目的是为了实现代码的可复用性.通过父类与子类的继承关系,子类继承了父类的成员函数和成员变量,提高了代码的重复利用率.同时,子类 ...

  7. java方法调用机制_Java方法调用机制 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...

    最近在编程时,修改方法传入对象的对象引用,并没有将修改反映到调用方法中.奇怪为什么结果没有变化,原因是遗忘了Java对象引用和内存分配机制.本文介绍3个点: ① 该问题举例说明 ② 简要阐述Java内 ...

  8. java服务端异步处理机制_Java异步处理机制实例详解

    通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异步则意味着某个处理过程可以允许多个线程同时处理.下面我们就来看看有关异步处理的详细内容. 异步通常代表着更好的性能,因为它很大程度上 ...

  9. java 反射 设置属性_Java通过反射机制动态设置对象属性值的方法

    /** * MethodName: getReflection * Description:解析respXML 在通过反射设置对象属性值 * User: liqijing * Date:2015-7- ...

最新文章

  1. SQLite数据库管理工具(SQLiteStudio)v3.1.1
  2. STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题
  3. 最优布线问题(普里姆算法)
  4. PHPUnit 3.4.10 在windows上配置
  5. JQuery中click() 和onclick()区别
  6. root目录空间不够的问题
  7. c++实现简单线程池代码
  8. PHP制作钱包银行金额数字展示功能实例
  9. 安卓开发之android使用webview时按后退会退出而不是回退的问题
  10. 机器学习(6): 层次聚类 hierarchical clustering
  11. sata接口 图解 定义_硬盘有几个接口 硬盘不同接口介绍【详解】
  12. SylixOS启动读取配置文件
  13. 【剑指Offer学习】【面试题22:栈的压入、弹出序列】
  14. js获取文件的后缀名
  15. makefile 编写
  16. Java中对象的逃逸分析
  17. 阿里巴巴 html圆代码,阿里巴巴国际站HTML代码全透视
  18. 我写过的软件之TSE-背景介绍
  19. 微信小程序收款手续费_为什么有人做的小程序交易手续费是0.38%而不是0.6%?
  20. 列出与'SCOTT'从事相同工作的所有员工及部门名称、部门人数、平均工资

热门文章

  1. 《程序员》2014年11月刊:电商峰值系统架构设计
  2. 网站静态化的实现以及纯伪静态优缺点
  3. 服务器性能查看常用命令
  4. CSS选取第n个元素 :nth-child()
  5. Win的cmd中文乱码
  6. Win谷歌插件加载失效
  7. lisp java_ai lisp java
  8. linux usb 触摸屏驱动,请教大家一个linux下的usb触摸屏驱动的问题
  9. netty web 容器_Netty 实战:如何编写一个麻小俱全的 web 框架
  10. SQL中的left join