- 浏览: 281621 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
jim8757:
能提供下完整的代码吗?
实例解析java + jQuery + json工作过程(登录) -
befairy:
收藏,谢谢LZ
基于Java、jQuery应用的账务管理系统开源了(09.3.19更新) -
Gilbert_Sam:
我看过这本书,很好,看到二十几章的地方,结果网站就登陆不上,写 ...
Linux C编程一站式学习 http://learn.akae.cn/ -
ljy520zhiyong:
这个网址进入不了呀
Linux C编程一站式学习 http://learn.akae.cn/ -
蜀山红日:
如果后台要向前台返回复杂数据该怎么办呢
实例解析java + jQuery + json工作过程(登录)
java语言的反射机制为是java语言所提供的一项特别吸引人的地方,利用反射我们可以对程序的运行进行动态的监控,开发使用反射特性的程序需要使用一些专门的工具类,这些工具类位于java.lang.reflect包中。
1.Class类简介
Class类属于java.lang包中,不需要使用import语句的引入就可以直接使用,其对象代表一个类,并携带类的一些信息,主要包含构造器,方法和成员变量。
注:a.java程序在运行的过程中,每个类加载后都在内存中产生一个对应的Class对象,一般来说,这个对象由系统来自动维护,不需要程序开发人员关心,
b.这里的Class中的“C”为大写,如果变成小写就声明成java的关键字了
下面首先通过一个列子来说明反射机制的使用
- package com;
- import java.lang.reflect.Method;
- public class ReflectTest {
- Method method [];
- public ReflectTest(){
- try{
- Class c=Class.forName("com.ReflectTest");
- method=c.getMethods();
- }catch(ClassNotFoundException e){
- e.printStackTrace();
- }
- if(method.length>0){
- for(int i=0;i<method.length;i++){
- System.out.println(method[i]);
- }
- }
- }
- public static void main(String args []){
- new ReflectTest();
- }
- }
package com; import java.lang.reflect.Method; public class ReflectTest { Method method []; public ReflectTest(){ try{ Class c=Class.forName("com.ReflectTest"); method=c.getMethods(); }catch(ClassNotFoundException e){ e.printStackTrace(); } if(method.length>0){ for(int i=0;i<method.length;i++){ System.out.println(method[i]); } } } public static void main(String args []){ new ReflectTest(); } }
这个例子就介绍了反射机制的一些简单的使用方法,首先Class.forName(String)获得一个类的信息,然后就可以对这个类的构造器,方法和成员变量等进行反射了,注意的是:forName(String)中的字符串必须是类完整路径,否则会出现ClassNotFoundException的异常。
另外,由于java中的数组是对象,因此数组对象也可以调用getClass()方法获取对应类的Class对象。
- public class ArrayReflection {
- public ArrayReflection(){
- String []stringArray=new String[4];
- int[][]intArray=new int[4][4];
- Class sc=stringArray.getClass();
- Class ic=intArray.getClass();
- System.out.println("一维string数组对应的类名为<SPAN style="COLOR: #000000">:"+</SPAN>sc.getName());
- System.out.println("二维int数组对应的类名为:"+ic.getName());
- }
- public static void main(String args []){
- new ArrayReflection();
- }
- }
- //运行结果为:
- 一维string数组对应的类名为:[Ljava.lang.String;
- 二维int数组对应的类名为:[[I
public class ArrayReflection {
public ArrayReflection(){
String []stringArray=new String[4];
int[][]intArray=new int[4][4];
Class sc=stringArray.getClass();
Class ic=intArray.getClass();
System.out.println("一维string数组对应的类名为:"+sc.getName());
System.out.println("二维int数组对应的类名为:"+ic.getName());
}
public static void main(String args []){
new ArrayReflection();
}
}
//运行结果为:
一维string数组对应的类名为:[Ljava.lang.String;
二维int数组对应的类名为:[[I
从运进结果我们可以看出,数组对象也有对应的类,"["表示数组,两个就表示二维数组。
在java中,每种基本数据类型都有对应的代号,对于int----I,boolean---Z,byte--B,char--C,long---J.可以到java网站查询详情
2.Field类的简单介绍
Field类的对象代表成员变量,携带的是成员变量的一些信息,需要注意的是,与Class类相似,Field对象不能通过构造方法的形式来创建对象,必须通过Class类提供的get方法来获得。
- import java.lang.reflect.Field;
- public class FieldReflectTest {
- public static void main(String args []){
- try{
- Student stu=new Student(21,2003,true,"tom");
- Class c=stu.getClass();
- Field field[]=c.getFields();
- for(int i=0;i<field.length;i++){
- System.out.println(field[i].getName());
- }
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
- class Student{
- public int age;
- public int sno;
- public boolean gender;
- public String name;
- public Student(int age,int sno,boolean gender,String name){
- this.age=age;
- this.sno=sno;
- this.gender=gender;
- this.name=name;
- }
- }
- //运行结果 age,sno,gender,name
import java.lang.reflect.Field; public class FieldReflectTest { public static void main(String args []){ try{ Student stu=new Student(21,2003,true,"tom"); Class c=stu.getClass(); Field field[]=c.getFields(); for(int i=0;i<field.length;i++){ System.out.println(field[i].getName()); } }catch(Exception e){ e.printStackTrace(); } } } class Student{ public int age; public int sno; public boolean gender; public String name; public Student(int age,int sno,boolean gender,String name){ this.age=age; this.sno=sno; this.gender=gender; this.name=name; } } //运行结果 age,sno,gender,name
从运行结果我们可以看出,我们可以利用对Student对象的反射,获得Student类的全部全局变量信息,注:只能获得修饰符为public 的全局变量,如果修饰符该为private将不能获得。
3.Mehod类的简介,
Method类的对象表示一个方法,主要用来携带方法的信息,它与Field类相似,不能通过构造器创建,而必须通过Class类的get方法来获得,主要可以使用的方法有:1.getName()获得方法名称,2.Class[] getParameterTypes()返回参数的序列, 3.Class getReturnType()返回方法返回值的类型。4.Object invoke(Object object,Object []args)此方法用来调用Method对象代表的方法,返回值是被调用方法的返回值,注:该方法无论方法返回什么值,都是做为Object对象返回。
- import java.lang.reflect.Method;
- public class MethodReflect {
- public static void main(String args []){
- try{
- ForeMethod fore=new ForeMethod();
- Class cl=fore.getClass();
- Method method[]=cl.getMethods();
- for(int i=0;i<method.length;i++){
- System.out.println("方法的返回值:"+method[1].getReturnType().getName());
- System.out.println("方法的名称为:"+method[i].getName());
- Class []cls=method[i].getParameterTypes();
- for(int j=0;j<cls.length;j++){
- System.out.print(method[i].getName()+"方法对应的参数为:"+cls[i].getName());
- }
- System.out.println();
- }
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
- class ForeMethod{
- public void sayHello(String name){
- System.out.println("你好,"+name);
- }
- public String generateNum(int max,int min){
- return (Math.random()*(max-min))+"";
- }
- }
import java.lang.reflect.Method; public class MethodReflect { public static void main(String args []){ try{ ForeMethod fore=new ForeMethod(); Class cl=fore.getClass(); Method method[]=cl.getMethods(); for(int i=0;i<method.length;i++){ System.out.println("方法的返回值:"+method[1].getReturnType().getName()); System.out.println("方法的名称为:"+method[i].getName()); Class []cls=method[i].getParameterTypes(); for(int j=0;j<cls.length;j++){ System.out.print(method[i].getName()+"方法对应的参数为:"+cls[i].getName()); } System.out.println(); } }catch(Exception e){ e.printStackTrace(); } } } class ForeMethod{ public void sayHello(String name){ System.out.println("你好,"+name); } public String generateNum(int max,int min){ return (Math.random()*(max-min))+""; } }
通过这个列子,我们就可以简单的了解Method类在反射机制中的使用了
源自:http://www.iteye.com/topic/309508
发表评论
-
自定义js延时函数
2010-03-26 11:38 4479setTimeout不是真正意义上的延时函数,而且在表单提交后 ... -
ssh jar包配置
2009-11-27 11:31 2271本文中ssh指:struts2,srping2.5,hib ... -
每个项目中,你不得不知的11个Java第三方类库
2009-11-02 09:06 1075Java第三方library ecosystem是一个很广阔的 ... -
J2EE学习中一些值得研究的开源项目
2009-08-10 10:07 1148这篇文章写在我研究J2SE、J2EE近三年后。前3年 ... -
对JXL包的研究(java操作excel)
2009-06-25 07:44 1502对JXL包的研究(java操作excel) 在开源世界中,有两 ... -
java类中成员的装载顺序你知道吗
2009-04-03 08:18 975最近去参加了SCJP培训,相信对于绝大多数的JAVA工作者来说 ... -
java操作word文件
2009-03-31 15:41 1684一个jacob操作Word的例子 import java. ... -
Java操作PDF文件(iText)
2009-03-31 15:32 5853然jacob中也有关于PDF的方法,但是过于复杂。iText是 ... -
java对excel操作
2009-03-31 15:11 1441从Excel文件读取数据表 Java Excel API既可 ... -
JAVA解析XML的四种方法
2009-03-31 08:49 1390XML现在已经成为一种通 ... -
Java:集合类性能分析
2009-03-20 20:41 19261.Java 集合框架图 -集合接口:6个接口(短虚 ... -
在看commons-lang.jar包源码时候的一些发现及实践
2009-03-11 10:55 3591通常,我们在完成一个标准的JavaBean的时候,都需要同时完 ... -
解决大批量数据导出Excel产生内存溢出的方案(二)
2009-03-11 10:42 6295客户要求一次导出20w行数据,这就要求导出的文件必须带shee ... -
解决大批量数据导出Excel产生内存溢出的方案
2009-03-11 10:41 5393POI或者JXL在导出大量数据的时候,由于它们将每一个单元格生 ... -
Java获取各种常用时间方法(二)
2009-03-11 09:43 1023//获得本年最后一天的日期 * ... -
Java获取各种常用时间方法
2009-03-11 09:40 1181本人之前做的项目中积累常用的时间方法,贴出来与大家共享,如果哪 ... -
JavaSE6.0 Web Service学习笔记(二)
2009-03-11 09:30 7377JavaSE6.0下的Web Service 从JavaSE6 ... -
JavaSE6.0 Web Service学习笔记(一)
2009-03-11 09:24 1407Web Service概述 Web Service ... -
JDK5.0 Annotation学习笔记(一)
2009-03-11 09:22 937背景知识: 从JDK5开始提供名为Annotat ... -
JasperReport报表设计总结(三)(已完毕)
2009-03-11 09:20 1361由于在一个里面不能贴太多的代码,故放置代码在此处。上接:htt ...
相关推荐
Java语言反射机制原理探析
Java语言反射机制原理探析.pdf
Java语言的反射机制 Java Reflection API
Java 语言的反射机制 在Java运行时环境中,对于任意一个类,可以知道这个类有哪些属性和方法。对于任意一个对象,可以调用它的任意一个方法。 这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的...
Java语言的反射机制
java语言的反射机制详细解说
Java 反射机制主要提供了以下功能: l 在运行时判断任意一个对象所属的类; l 在运行时构造任意一个类的对象; l 在运行时判断任意一个类所具有的成员变量和方法; l 在运行时调用任意一个对象的方法; l 生成...
有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic ...是可以通过反射机制来实现“动态”,用一个实例来说明一下:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。
这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机...
JAVA语言中的反射机制
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的...
Java 反射机制主要提供 了以下功能: 在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所具有的成员变量和方法; 在运行时调用任意一个对象的方法; 生成动态...
java-反射机制-源码
这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。 Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第4页。 3.2.2 反射机制的功能 反射机制的功能如下: 在运行时判定任意...