Java反射之——Java获取类中成员变量和构造函数的信息

我们无论是获取成员变量信息,亦或者是获取构造函数的信息,都必须获取类的类类型,然后通过类的类类型进行对成员变量和构造函数的操作。

注:成员变量和构造函数也都是对象,前者是Feild的对象,在java.lang.reflec.Feild中封装了对成员变量的信息。后者是Constructor的对象,在java.lang.reflec.Constructor中封装了对构造函数的信息。

一、获取类中成员变量的信息

getDeclaredFields()——获取的是自身声明的成员变量,无修饰符的限制;

getFields()获取的是public修饰的成员变量

我们推荐使用getDeclaredFields()

getType()——获取成员变量的类型的类类型

奉上代码:

/**
 * 获取类中成员变量的信息
 * 注:成员变量也是对象,是Field类的对象,在java.lang.reflec.Field包中封装了对成员变量的操作
 *
 */
public class FieldUtil {
    public static void print(Object obj) {
        //获取类的类类型
        Class c = obj.getClass();
        System.out.println("类的全称:"+c.getName());
        //获取类中的成员变量
        //注:推荐使用getDeclaredFields(),因为该方法获取的是类自身声明的全部成员变量,没有修饰权限的限制
        //而getFields()获取的是public修饰的成员变量
        Field[] fields = c.getDeclaredFields();
        for (Field field : fields) {
            //获取成员变量的类型的类类型
            Class fieldType = field.getType();
            System.out.print("成员变量的类型的名称:"+fieldType.getName()+" ");
            //获取成员变量的全称
            System.out.println("成员变量的名称:"+field.getName());
        }
    }
}

在主函数中调用:FieldUtil.print("hello");

输出结果:

类的全称:java.lang.String
成员变量的类型的名称:[C 成员变量的名称:value
成员变量的类型的名称:int 成员变量的名称:hash
成员变量的类型的名称:long 成员变量的名称:serialVersionUID
成员变量的类型的名称:[Ljava.io.ObjectStreamField; 成员变量的名称:serialPersistentFields
成员变量的类型的名称:java.util.Comparator 成员变量的名称:CASE_INSENSITIVE_ORDER

在主函数中调用:FieldUtil.print(new Integer(1));

输出结果:

类的全称:java.lang.Integer
成员变量的类型的名称:int 成员变量的名称:MIN_VALUE
成员变量的类型的名称:int 成员变量的名称:MAX_VALUE
成员变量的类型的名称:java.lang.Class 成员变量的名称:TYPE
成员变量的类型的名称:[C 成员变量的名称:digits
成员变量的类型的名称:[C 成员变量的名称:DigitTens
成员变量的类型的名称:[C 成员变量的名称:DigitOnes
成员变量的类型的名称:[I 成员变量的名称:sizeTable
成员变量的类型的名称:int 成员变量的名称:value
成员变量的类型的名称:int 成员变量的名称:SIZE
成员变量的类型的名称:int 成员变量的名称:BYTES
成员变量的类型的名称:long 成员变量的名称:serialVersionUID

二、获取构造函数的信息(构造函数无返回值)

getDeclaredConstructors()——获取的是自身声明的构造函数,没有修饰符的限制,构造函数必须是自身声明的

getConstructors()——获取的是所有public类型的构造函数

getParameterTypes()——获取的是参数列表的类型的类类型

代码奉上:

/**
 * 获取类中构造函数的信息
 * 构造函数也是对象,是Constructor的对象,在java.lang.reflec.Constructor包中封装了对构造函数的操作
 *
 */
public class ConstructorUtil {

    public static void print(Object obj) {
        //获取类的类类型
        Class c = obj.getClass();
        System.out.println("类的全称:"+c.getName());
        //获取类中的构造函数
        //注:推荐使用getDeclaredConstructors(),获取的是自身声明的构造函数,没有修饰符的限制,构造函数必须是自身声明的
        //getConstructors()获取的是所有public类型的构造函数
        Constructor[] ct = c.getDeclaredConstructors();
        for (Constructor constructor : ct) {
            //构造函数无返回值类型
            //获取构造函数的名称
            String constructorName = constructor.getName();
            System.out.print("构造函数的名称:"+constructorName+"(");
            //获取构造函数参数列表的类型的类类型
            Class[] paramTypes = constructor.getParameterTypes();
            for (Class class1 : paramTypes) {
                System.out.print("参数列表的名称是:"+class1.getName()+",");
            }
            System.out.println(")");
        }
        
        
    }
}

主函数调用:ConstructorUtil.print("hello");

输出结果:

类的全称:java.lang.String
构造函数的名称: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,)

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值