什么时候使用Reflection

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

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

Reflection机制最常用于struts机制。怎么知道它是一个Action和FormBean而不是一个Servlet?这就是在Web Server启动时,它先从struts-config文件中得到所有Action、FormBean的路径、配置信息,再利用Reflection机制来判断Action和FormBean是不是一个Action或是一个Servlet。

*** 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机制的更多相关文章

  1. 深入理解Java:类加载机制及反射

    说明:本文乃学习整理参考而来. 一.Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构 ...

  2. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  3. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  4. java的类加载机制

    1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class ...

  5. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

  6. java笔录---反射机制(1)

    引言   为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架,   像spring中核心模块IO ...

  7. 深入理解 Java 动态代理机制

    Java 有两种代理方式,一种是静态代理,另一种是动态代理.对于静态代理,其实就是通过依赖注入,对对象进行封装,不让外部知道实现的细节.很多 API 就是通过这种形式来封装的. 代理模式结构图(图片来 ...

  8. Java:类加载机制及反射

    一.Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允 ...

  9. java的反射机制浅谈(转)

    原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...

随机推荐

  1. 修改 Docker-MySQL 容器的 默认用户加密规则

    背景介绍 今天开始做集成测试,需要把程序和环境重新部署在新的服务器上.项目的环境都是基于Docker来的,所以数据库也是选择从Docker官网上面拉官方的MySQL镜像.(Tag = 8.0.12) ...

  2. 自定义ExtJS插件

    http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73b6f93834c28c3933fc239045647 ...

  3. 批处理框架-spring Batch

    并发处理业务 数据量大,并发度高,要支持事物,回滚,并发机制.事务.并发.监控.执行等,并不提供相应的调度功能.因此,如果我们希望批处理任务定期执行,可结合 Quartz 等成熟的调度框架实现. 业务 ...

  4. centos7的web环境安装配置

    1.安装基本东西安装apache   yum install httpd安装mariadb  yum install mariadb mariadb-server安装php yum install p ...

  5. 不常用的容易忘记常见mysql操作数据表命令

    删除外键关联的约束 alter table tablename drop  foreign key keyname;

  6. OpenACC 与 CUDA 的相互调用

    ▶ 按照书上的代码完成了 OpenACC 与CUDA 的相互调用,以及 OpenACC 调用 cuBLAS.便于过程遇到了很多问题,注入 CUDA 版本,代码版本,计算能力指定等,先放在这里,以后填坑 ...

  7. 10. 数据模型(ER图)转为sql脚本,要求导出的字段都是大写的

    1.进入Tools-->Execute Commands-->Edit/Run Script,执行以下脚本即可实现所有字段转为大写; Option Explicit ValidationM ...

  8. VBA 禁止保存

    禁止保存 在workbook事件中 Private Sub Workbook_BeforeClose(Cancel As Boolean)    Me.Saved = TrueEnd Sub Priv ...

  9. as3 三行三列 布满9个为一个界面

    var n:int=int(iconIndex/3); e.x =(int(n/3)*3+iconIndex%3)*557; e.y = int(iconIndex / 3) % 3 * 260; i ...

  10. Tomcat 多项目管理

    有时我们会在一个服务下存在多个项目的情况,为了统一管理和服务运行安全考虑,有时候我们需要重新部署一个项目但又不能停掉其它项目,就可以用manager进行管理. Tomcat manager和Root访 ...