美文网首页
Java反射用法2 : 类成员(Class Members)

Java反射用法2 : 类成员(Class Members)

作者: 厨房里的工程师 | 来源:发表于2018-04-09 11:13 被阅读0次

一、什么是类的成员?

众所周知,Java反射可以在运行时获取类的成员。那么问题来了,什么是类的成员呢?一起来看一下Java 7给出的官方解释:

According to The Java Language Specification, Java SE 7 Edition, the members of a class are the inherited components of the class body including fields, methods, nested classes, interfaces, and enumerated types. Since constructors are not inherited, they are not members. This differs from the implementing classes of java.lang.reflect.Member.

以上信息可以理解为:

类的成员包括:从父类继承得到的成员变量,方法;内嵌的类,接口,枚举类型。因为构造方法无法被继承,所以不是类成员。

二、成员变量(field)

1. 获取成员变量

先来看一个对ClassAPI中获取成员变量方法的总结。

Class API 通过List返回多个成员变量 返回父类成员变量 返回私有成员变量
getDeclaredField() no no yes
getField() no yes no
getDeclaredFields() yes no yes
getFields() yes yes no

Class对象提供了四种方法来获取类的成员变量,其中getDeclaredField()getField()都是需要通过提供变量名称来获取单一成员变量。getFields()getDeclaredFields()则可以通过链返回多个成员变量。

Class c = ... // 获取Class对象
Field field = c.getField("fieldName") // 通过成员变量名称获取
Field[] fields = c.getFields() // 获取公有成员变量,包括父类的公有成员变量

通过以上表,我们可以得知无法通过这四种方法来获取父类的私有成员变量。

2. 获取成员变量的名字、类型和修饰器

(1). 名字
通过Field类的Field.getName()来获取变量名

Field field = ... // 获取成员变量对象
String fieldName = field.getName();

(2). 类型
通过Field类的Field.getType()来获取变量类型

Class c = String.class; // String 类
Field[] fields = c.getFields(); // 获取String类的成员变量
Object fieldType = fields[0].getType(); // 获取变量类型

(3). 修饰器
通过Field类的Field.getModifiers()来获取变量类型

Class c = String.class; // String 类
Field[] fields = c.getFields(); // 获取String类的成员变量
int modifier = fields[0].getModifiers(); // 所有修饰器都对应到了一个整型数值
Modifier.toString(modifier); // 将整型数值转成相应的修饰器字符串

Field 类还提供了Field.isSynthetic()Field.isEnumConstant()方法。前者确定变量是否是合成的,后者确定变量是否属于枚举常量。

3. 获取成员变量值、对成员变量赋值

Class c = MyObject.class;
Field field = c.getField("fieldName"); 

MyObject newInstance = new MyObject(); // 创建对象实例

Object value = field.get(newInstance); // 从对象实例中获取成员变量的值

field.set(newInstance, value); // 对成员变量进行赋值

三、方法(method)

先看对ClassAPI中获取method途径的总结。

Class API 通过List返回多个方法 返回父类方法 返回私有方法
getDeclaredMethod() no no yes
getMethod() no yes no
getDeclaredMethods() yes no yes
getMethods() yes yes no

获取方法(method)同样有四种途径,具体差别和获取成员变量一样,不再赘述。

需注意的是:使用getMethod()getDeclaredMethod()时需要给出参数的类型,不带参数时则要给出null。比较神奇的是:当参数时原始值(primitive)类型时,你可以直接用int.classboolean.class等作为参数类型。

Class c = String.class;
Method method1 = c.getMethod("charAt", int.class); // 通过方法名和参数类型int获取方法
Method method1 = c.getMethod("getBytes", new Class[]{String.class}); // 通过方法名和参数类型String获取方法

String methodName = method1.getName(); // 获取方法名

1. 获取类方法的参数类型和返回类型(Return Type)

Method method = ... // 获取方法
Class[] parameterTypes = method.getParameterTypes(); //获取参数类型
Class returnType = method.getReturnType(); // 获取返回类型

2. 获取类方法的修饰器

Method method = ... 
int modifier = method.getModifiers();

3. 检查参数数量是否确定

Method method = ... 
boolean varArgs = method.isVarArgs();

4. 调用方法(method)

通过Methodinvoke()调用方法

Method method = String.class.getMethod("charAt", int.class);
Char returnValue = method.invoke("Hello", 4);

参考文献


Java Reflection - Tutorials
Java Reflection - Fields
Java Reflection - Methods

相关文章

  • Java反射用法2 : 类成员(Class Members)

    一、什么是类的成员? 众所周知,Java反射可以在运行时获取类的成员。那么问题来了,什么是类的成员呢?一起来看一下...

  • Java基础之反射

    Java-Reflect Class类的使用 方法的反射 成员变量的反射 构造函数的反射 Java类加载机制 一、...

  • 反射Class

    class类的使用 方法的反射 成员变量的反射 构造函数的反射 Java类加载机制 反射帮我们做一些程序运行时刻的...

  • 2020-07-04【反射】

    类加载 类加载器 反射概述 获取Class类的对象 反射获取构造方法并使用 反射获取成员遍历并使用 反射获取成员方...

  • 2018-07-16-Java反射

    ** Java反射总结** 1,反射获取类的class对象的方式 2,证明在运行期间,一个类,只有一个Class对...

  • [JAVA学习笔记] 反射机制

    [JAVA学习笔记] 反射机制 Java的反射通过Class类和java.lang.reflect类库实现。通过它...

  • java基础3

    1、说说对Class类的理解 2、说说Class/Java动态加载类 3、通过反射获取类的方法、变量等 4、方法的...

  • Java学习之反射

    一、Class 1、概述: 1、Class是Java程序中各个Java类的总称;它是反射的基石,通过Class类来...

  • Class类

    什么是Class类 Class类是java.lang包中的类,是java反射中的一个特别重要的类,因为Class类...

  • java 反射

    java 反射 Class 类介绍 以下所有大写的 Class 都表示 java.lang.Class 1.jav...

网友评论

      本文标题:Java反射用法2 : 类成员(Class Members)

      本文链接:https://www.haomeiwen.com/subject/qlovhftx.html