Java的Reflection机制
什么时候使用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机制的更多相关文章
- 深入理解Java:类加载机制及反射
说明:本文乃学习整理参考而来. 一.Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构 ...
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
- java的反射机制
一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
- java的类加载机制
1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class ...
- JAVA的反射机制学习笔记(二)
上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...
- java笔录---反射机制(1)
引言 为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架, 像spring中核心模块IO ...
- 深入理解 Java 动态代理机制
Java 有两种代理方式,一种是静态代理,另一种是动态代理.对于静态代理,其实就是通过依赖注入,对对象进行封装,不让外部知道实现的细节.很多 API 就是通过这种形式来封装的. 代理模式结构图(图片来 ...
- Java:类加载机制及反射
一.Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允 ...
- java的反射机制浅谈(转)
原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...
随机推荐
- 怎样使用 css 的@media print控制打印
怎样使用 css 的@media print控制打印? <HTML> <HEAD> <TITLE> New Document </TITLE> < ...
- Python 常用PEP8规范
目录 目录 代码布局 缩进 最大行宽 空行 模块导入 字符串 表达式和语句中的空格 注释 命名规则 编程建议 代码布局 缩进 每级缩进用4个空格. 括号中使用垂直隐式缩进或使用悬挂缩进. EXAMPL ...
- SVM的sklearn.svm.SVC实现与类参数
SVC继承了父类BaseSVC SVC类主要方法: ★__init__() 主要参数: C: float参数 默认值为1.0 错误项的惩罚系数.C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确 ...
- 【基础知识五】神经网络NN
常用模型:BP神经网络,RBF神经网络 一.神经元模型 | 连接权,阈值,激活函数 1. 输入信号通过带权重的连接(connection)进行传递,神经元接收到的总输入值将与神经元的阈值进行比较, ...
- bitmap运算
概述 所谓bitmap就是用一个bit位来标记某个元素对应的value,而key即是这个元素.由于采用bit为单位来存储数据,因此在可以大大的节省存储空间 算法思想 32位机器上,一个整形,比 ...
- 双向链表-java完全解析
原文:https://blog.csdn.net/nzfxx/article/details/51728516 "双向链表"-数据结构算法-之通俗易懂,完全解析 1.概念的引入 相 ...
- 【求助】win 2008 R2 远程桌面多用户,破解最大连接数2的限制
[求助]win 2008 R2 远程桌面多用户,破解最大连接数2的限制. 1. 本地组策略设置的是“允许的RD最大连接数 5”. 2. 远程桌面仍然只能有两个连接在线. 3. 后来发现是下面这个设置限 ...
- flask框架预备知识
1.web预备知识 2.flask介绍 3.web框架的本质及分类 4.flask安装与基本设置 1.web预备知识 HTTP协议:https://www.cnblogs.com/wyb666/p/9 ...
- linux随机数
linux系统随机数生成;1,利用uuid(universally unique identifier),由open software foundation在distributed computing ...
- centos7.3安装zend guard loader3.3 for php5.6
1 下载zend guard loader 到这里选择自己的系统版本 我选择的64位 for php5.6.3 linux http://www.zend.com/en/products/load ...