锁定老帖子 主题:java语言的反射机制1
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-04
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(); } } 这个例子就介绍了反射机制的一些简单的使用方法,首先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数组对应的类名为:"+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 从运行结果我们可以看出,我们可以利用对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))+""; } }
通过这个列子,我们就可以简单的了解Method类在反射机制中的使用了 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 1953 次