java反射:获取类的成员变量和构造函数

来源:互联网 发布:手机隔墙听软件 编辑:程序博客网 时间:2024/05/21 06:51

    前面我们讲到过怎么利用java反射机制获取类的所有方法的信息。那么我们如何利用反射获取类的成员变量以及构造函数的信息呢?
    首先我们明确一个概念:成员变量也是对象,我们可以通过成员变量的类类型获取到成员变量的类型

 Class c=int.class; System.out.println(c.getName());

    则我们会看到控制台输出:int,意味着基本数据类型也是对象,我们可以通过数据类型的类类型获取到它的基本类型
    那么成员变量是哪个类的对象呢?成员变量是java.lang.reflect.Field类的对象,该类提供了一些方法是我们能够获取到成员变量的类型、名称等信息,接下来通过一段代码进行测试:

public static void printDataTypeMessage(Object obj) {    System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");    Class c=obj.getClass();    //Field[] fs=c.getFields();//获取的是所有的public的成员变量,    Field[] fs=c.getDeclaredFields();//获取所有自己声明的成员变量的信息    for (Field field : fs) {    Class fieldType=field.getType();//得到成员变量的类型的类类型    String typeName=fieldType.getName();    String fieldName=field.getName();//成员变量的名称    System.out.println(typeName+" "+fieldName);    }}

获取String类的成员变量:

ClassAPI.printDataTypeMessage("hello");

运行结果为:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[C value
int hash
long serialVersionUID
[Ljava.io.ObjectStreamField; serialPersistentFields
java.util.Comparator CASE_INSENSITIVE_ORDER

    由此获取了所有的成员变量,包括公有的和私有的
    那么构造函数是对象吗?构造函数也是对象,它是java.lang.Constructor类的对象,我们通过一段代码来测试一下如何获取构造函数的基本信息:

public static void printConstructorMessage(Object obj) {    System.out.println("===============================================");    Class c=obj.getClass();    Constructor[] con=c.getDeclaredConstructors();//获得所有的公有的构造方法,构造函数都是自己声明的    for (Constructor constructor : con) {        String conName=constructor.getName();        System.out.print(conName+"(");        Class[] types=constructor.getParameterTypes();//得到参数列表的类类型        for (Class class1 : types) {            System.out.print(class1.getName()+",");        }        System.out.println(")");        }}

对String类的构造函数和Integer类的构造函数进行测试:

ClassAPI.printConstructorMessage("hello");ClassAPI.printConstructorMessage(new Integer(1));

得到运行结果为:

===============================================


java.lang.String([B,int,int,)
java.lang.String([B,java.nio.charset.Charset,)
java.lang.String([B,java.lang.String,)
java.lang.String([B,int,int,java.nio.charset.Charset,)
java.lang.String([B,int,int,java.lang.String,)
java.lang.String([C,boolean,)
java.lang.String(java.lang.StringBuilder,)
java.lang.String(java.lang.StringBuffer,)
java.lang.String([B,)
java.lang.String([I,int,int,)
java.lang.String()
java.lang.String([C,)
java.lang.String(java.lang.String,)
java.lang.String([C,int,int,)
java.lang.String([B,int,)
java.lang.String([B,int,int,int,)
===============================================

java.lang.Integer(int,)
java.lang.Integer(java.lang.String,)

阅读全文
0 0