Java的Reflection机制
什么时候使用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机制相关推荐
- java的reflection机制_Java的Reflection机制
什么时候使用Reflection: 在java语言中,创建一个类的对象通常使用new operator,但是如果预先不知道类名,类名是在程序运行过程中通过参数传递过来,就没法使用这种方法了,这种情况下 ...
- JAVA的内省机制(introspector)与反射机制(reflection)
http://yangzhibin-java.iteye.com/blog/452068 JAVA的内省机制(introspector)与反射机制(reflection) 博客分类: j2se Jav ...
- 深入理解Java:类加载机制及反射
一.Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允 ...
- gc java root_聊聊Java的GC机制
原标题:聊聊Java的GC机制 近日,MIUI在小米全球社区发布公告,表示MIUI将在全球市场销售的手机中预装谷歌拨号及谷歌消息应用程序(中国.印度.印度尼西亚等市场除外).小米表示,小米9T Pro ...
- 搞懂Java的反射机制
搞懂Java的反射机制 1.什么是反射? java的反射机制是指可以在运行状态下获取类和对象的所有属性和方法. 2.反射的作用? 1.在运行时获取一个类/对象的成员变量和方法 2.在运行时创建一个类的 ...
- java原理—反射机制
http://www.cnblogs.com/forlina/archive/2011/06/21/2085849.html 一.什么是反射: 反射的概念是由Smith在1982年首次提出的,主要是指 ...
- 学习:java原理—反射机制
一.什么是反射: 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提 出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...
- 什么是Java的反射机制?
Java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在JavaBean 中广泛应用的一种特性. 运用JavaBean 的最常见的问题是:根据指定的类名,类字段名和所对应的数据,得到该类的实 ...
- java中反射机制的含义_java的反射是什么意思?
反射是Java的特征之一,是一种间接操作目标对象的机制. Java反射机制指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法:对于给定的一个对象,都能够调用它的任意一个属 ...
最新文章
- 色彩(颜色)空间原理(实现代码)
- 【PC工具】震精!这个云办公云平台好强大,UZERME云端超级应用平台
- Linux下,使用nginx+ffmpeg+video.js实现直播效果(含centos7环境配置步骤)
- Netty(一) SpringBoot 整合长连接心跳机制
- 图论复习——最小生成树MST
- select ... into ... 与 insert into .... select .... 语句
- [转载] plt.hist()和numpy.histogram()的学习
- 拓端tecdat|TensorFlow 2建立神经网络分类模型——以iris数据为例
- oracle 数据分列,如何使用Excel把有规律地txt文本数据分列
- DVWA靶机安装教程
- WinHTTP实现文件下载 C++程序
- 周杰伦专辑《最伟大的作品》在哪看?当贝盒子畅享周董最新MV
- make VERBOSE=1等的作用
- 2017小象学院Python数据分析与挖掘
- Ethereum Yellow Paper
- python因数之和等于数字本身,完全数,盈数,亏数到底是什么鬼?python实现给你看...
- Docker(24)- docker login 命令详解
- STM32毕业设计题目大全 选题推荐
- 方块填数 “数独”是当下炙手可热的智力游戏。一般认为它的起源是“拉丁方块”,是大数学家欧拉于1783年发明的。 如图[1.jpg]所示:6x6的小格被分为6个部分(图中用不同的颜色区分),每个部
- 阿里旗下多个App已接入微信支付
热门文章
- py导入包异常跳出_python~异常处理及包
- cnn 预测过程代码_代码实践 | CNN卷积神经网络之文本分类
- revit二次开发概念_BIM百科 | Revit二次开发入门--创建一个简单的程序
- 数据库和python的结合_redis数据库及与python交互用法简单示例
- html有定位页面长度,html – 如何让div / span“填写”页面的剩余宽度/高度,并保持固定位置?...
- 递归走迷宫java,java递归实现的迷宫游戏
- 三次握手的本质_关于TCP三次握手,这是我见过最好的解读了,通俗易懂
- html广告20s倒计时,简单时尚的jQuery倒计时插件
- libsvm3.21 matlab,Matlab 2015b安装libsvm 3.21
- php 类 private,有关php类的private属性继承问题详解