Java 反射

2017/12/07 Java

Java 反射

指的是可以在运行时加载,探知和使用的在编译期间完全未知的类。 程序在运行状态中可以动态的加载一个只有名称的类,对于任意一个已经加载的类,都可以知道这个类的所有属性和方法,对于任一对象,都能调用它的任意方法和属性。 加载完类之后, 在堆内存中会产生一个Class类型的对象(一个类只有一个Class对象), 这个对象包含了完整的类的结构信息,而且这个Class对象就像一面镜子,透过这个镜子看到类的结构,所以被称之为:反射。

获得Class对象

  • 对象的getClass()方法
  • 类的.class(最安全,最快)属性
  • 使用Class.forName(String className)动态的加载类,className需要是类的全名。

从Class中获取信息

Class类提供了大量的实例方法来获取该类对象的详细信息。

获取类内信息

内容 方法
构造器 Constructor getConstructor(Class<?> ... parameterTypes)
方法 Method getMethod(String name,Class<?> parameterTypes)
属性 Field getField(String name)
包含的Annotation A getAnnotation(Class annotationClass)
内部类 Class<?>[] getDeclaredClasses()
外部类 Class<?> getDeclaringClass()
所实现的接口 Class<?>[] getInterfaces()
修饰符 int getModifiers()
所在包 Package getPackage()
类名 String getName()
简称 String getSimpleName()

用来判断类本身信息的方法

内容 方法
是注解类型 boolean isAnnotation()
使用了注解吗 boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
匿名类 boolean isAnonymousClass()
数组 boolean isArray()
枚举 boolean isEnum()
原始类型 boolean isPrimitive()
接口 boolean isInterface()
obj是该类的实例 boolean isInstance(Object obj)

Method Constructor Field这些类都实现了java.lang.reflect.Member接口,程序可以通过Method对象来执行相应的方法,通过Constructor对象来调用对应的构造器创建实例,通过Filed对象直接访问和修改对象的成员变量值.

创建对象

  • 使用Class对象的newInstance()方法来创建该Class对象对应类的实例(这种方式要求该Class对象的对应类有默认构造器)。
  • 先使用Class对象获取指定的Constructor对象, 再调用Constructor对象的newInstance()方法来创建该Class对象对应类的实例(通过这种方式可以选择指定的构造器来创建实例)。

调用方法

当获取到某个类对应的Class对象之后, 就可以通过该Class对象的getMethod来获取一个Method数组或Method对象.每个Method对象对应一个方法,在获得Method对象之后,就可以通过调用invoke方法来调用该Method对象对应的方法。

访问成员变量

通过Class对象的的getField()方法可以获取该类所包含的全部或指定的成员变量Field,Filed提供了如下两组方法来读取和设置成员变量值.

  • getXxx(Object obj): 获取obj对象的该成员变量的值, 此处的Xxx对应8中基本类型,如果该成员变量的类型是引用类型, 则取消get后面的Xxx;
  • setXxx(Object obj, Xxx val): 将obj对象的该成员变量值设置成val值.此处的Xxx对应8种基本类型, 如果该成员类型是引用类型, 则取消set后面的Xxx;

使用反射获取泛型信息

为了通过反射操作泛型以迎合实际开发的需要, Java新增了java.lang.reflect.ParameterizedType java.lang.reflect.GenericArrayTypejava.lang.reflect.TypeVariable java.lang.reflect.WildcardType几种类型来代表不能归一到Class类型但是又和原始类型同样重要的类型。

类型 含义
ParameterizedType 参数化类型,如List
GenericArrayType 一种元素类型是参数化类型或者是类型变量的数组类型
TypeVariable 各种类型变量的公共接口
WildcardType 一种通配符表达式,如 ? extends Number , ? super Inter
Show Disqus Comments

Search

    Table of Contents