什么时候使用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()可以获得类的构造函数。

转载于:https://www.cnblogs.com/qionglouyuyu/p/4609600.html

Java的Reflection机制相关推荐

  1. java的reflection机制_Java的Reflection机制

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

  2. JAVA的内省机制(introspector)与反射机制(reflection)

    http://yangzhibin-java.iteye.com/blog/452068 JAVA的内省机制(introspector)与反射机制(reflection) 博客分类: j2se Jav ...

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

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

  4. gc java root_聊聊Java的GC机制

    原标题:聊聊Java的GC机制 近日,MIUI在小米全球社区发布公告,表示MIUI将在全球市场销售的手机中预装谷歌拨号及谷歌消息应用程序(中国.印度.印度尼西亚等市场除外).小米表示,小米9T Pro ...

  5. 搞懂Java的反射机制

    搞懂Java的反射机制 1.什么是反射? java的反射机制是指可以在运行状态下获取类和对象的所有属性和方法. 2.反射的作用? 1.在运行时获取一个类/对象的成员变量和方法 2.在运行时创建一个类的 ...

  6. java原理—反射机制

    http://www.cnblogs.com/forlina/archive/2011/06/21/2085849.html 一.什么是反射: 反射的概念是由Smith在1982年首次提出的,主要是指 ...

  7. 学习:java原理—反射机制

    一.什么是反射: 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提 出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  8. 什么是Java的反射机制?

    Java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在JavaBean 中广泛应用的一种特性. 运用JavaBean 的最常见的问题是:根据指定的类名,类字段名和所对应的数据,得到该类的实 ...

  9. java中反射机制的含义_java的反射是什么意思?

    反射是Java的特征之一,是一种间接操作目标对象的机制. Java反射机制指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法:对于给定的一个对象,都能够调用它的任意一个属 ...

最新文章

  1. 色彩(颜色)空间原理(实现代码)
  2. 【PC工具】震精!这个云办公云平台好强大,UZERME云端超级应用平台
  3. Linux下,使用nginx+ffmpeg+video.js实现直播效果(含centos7环境配置步骤)
  4. Netty(一) SpringBoot 整合长连接心跳机制
  5. 图论复习——最小生成树MST
  6. select ... into ... 与 insert into .... select .... 语句
  7. [转载] plt.hist()和numpy.histogram()的学习
  8. 拓端tecdat|TensorFlow 2建立神经网络分类模型——以iris数据为例
  9. oracle 数据分列,如何使用Excel把有规律地txt文本数据分列
  10. DVWA靶机安装教程
  11. WinHTTP实现文件下载 C++程序
  12. 周杰伦专辑《最伟大的作品》在哪看?当贝盒子畅享周董最新MV
  13. make VERBOSE=1等的作用
  14. 2017小象学院Python数据分析与挖掘
  15. Ethereum Yellow Paper
  16. python因数之和等于数字本身,完全数,盈数,亏数到底是什么鬼?python实现给你看...
  17. Docker(24)- docker login 命令详解
  18. STM32毕业设计题目大全 选题推荐
  19. 方块填数 “数独”是当下炙手可热的智力游戏。一般认为它的起源是“拉丁方块”,是大数学家欧拉于1783年发明的。 如图[1.jpg]所示:6x6的小格被分为6个部分(图中用不同的颜色区分),每个部
  20. 阿里旗下多个App已接入微信支付

热门文章

  1. py导入包异常跳出_python~异常处理及包
  2. cnn 预测过程代码_代码实践 | CNN卷积神经网络之文本分类
  3. revit二次开发概念_BIM百科 | Revit二次开发入门--创建一个简单的程序
  4. 数据库和python的结合_redis数据库及与python交互用法简单示例
  5. html有定位页面长度,html – 如何让div / span“填写”页面的剩余宽度/高度,并保持固定位置?...
  6. 递归走迷宫java,java递归实现的迷宫游戏
  7. 三次握手的本质_关于TCP三次握手,这是我见过最好的解读了,通俗易懂
  8. html广告20s倒计时,简单时尚的jQuery倒计时插件
  9. libsvm3.21 matlab,Matlab 2015b安装libsvm 3.21
  10. php 类 private,有关php类的private属性继承问题详解