跟王老师学反射:Class类:从Class类中获取信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跟王老师学反射:Class类:从Class类中获取信息相关的知识,希望对你有一定的参考价值。

跟王老师学反射(四)Class类:从Class类中获取信息

主讲教师:王少华   QQ群号:483773664

学习内容

获得class类中的信息


根据我们以前学过的一个Java类有以下几部组成,如下代码所示

技术分享

技术分享

一、访问Class对应的类所包含的构造方法

(一)public Constructor<T> getConstructor(Class<?>... parameterTypes)

返回此Class对象所表示的类的指定public构造方法。

parameterTypes参数是按声明顺序标识该方法参数类型的Class对象的一个数组。

构造方法的参数类型与parameterTypes所指定的参数类型匹配

技术分享

技术分享
(二)、public Constructor<?>[] getConstructors()

返回此Class对象所表示的类的所有public构造方法

技术分享

(三)public Constructor<?>[] getDeclaredConstructors()

返回此Class对象所表示的类的所有构造器,与构造器的访问级别无关

技术分享

(四)getDeclaredConstructor(Class<?>... parameterTypes) 

返回此Class对象所表示的类指定构造器,与构造器的访问级别无关

二、访问Class对应的类所包含的方法

(一)public Method getMethod(String name, Class<?>... parameterTypes)

返回此Class对象所表示的类的指定public方法

name参数用于指定方法名称

params参数是按声明顺序标识该方法参数类型的Class对象的一个数组

技术分享

(二)public Method[] getMethods()

数组类返回从 Object 类继承的所有(公共)方法。

技术分享

技术分享

(三)public Method getDeclaredMethod(String name, Class<?>... parameterTypes)

返回此Class对象所表示的类的绽方法,与方法的访问级别无关

name - 方法名

parameterTypes - 参数数组 

(四)public Method[] getDeclaredMethods()

返回此Class对象所表示的类的全部方法,与方法的访问级别无关

三、访问Class对应的类所包含的属性

(一)public Field getField(String name)

返回此Class对象所表示的类的指定的public属性

name:指定属性名称

技术分享

(二)public Field[] getFields()

返回此Class对象所表示的类的所有public属性

(三)public Field getDeclaredField(String name)

返回此Class对象所表示的类的指定属性,与属性访问级别无关

(四)public Field[] getDeclaredFields()

返回此Class对象所表示的类的全部属性,与属性访问级别无关

技术分享

技术分享

四、访问Class对应的类上所包含的注释

关于注释的内容,我们将在下一章给大家作详细讲解,这里只介绍API中的访问。

(一)public <A extends Annotation> A getAnnotation(Class<A> annotationClass)

试图获取该Class对象所表示类上指定类型的注释,如果该类型的注释不存在,则返回null

技术分享

(二)public Annotation[] getAnnotations()

返回此元素上存在的所有注释

(三)public Annotation[] getDeclaredAnnotations()

返回直接存在于此元素上的所有注释

五、访问Class对象对应类包含的内部类

(一)public Class<?>[] getDeclaredClasses()

返回该Class对象所对应类里包含的全部内部类。

技术分享

技术分享

六、访问该Class对象对应类所在的外部类

(一)public Class<?> getDeclaringClass()

返回该Class对象所对应类所在的外部类

1
2
3
public static void test7(Class<Child> childClass){
        Class<Person> personClass= (Class<Person>) childClass.getDeclaringClass();
    }

备注:访问外部类和内部类的方法名称的区别

七、访问该Class对象所对应类所继承的父类、所实现的接口

(一)public Class<?>[] getInterfaces()

返回该Class对象对应类所实现的全部接口

(二)public int getModifiers()

返回此类或接口的所有修饰符。修饰符由public、protected、private、final、static、abstract等对应的常量组成,返回整数应使用Mofifier工具类的方法来解码,才可以获取真实的修饰符。

技术分享

(三)public Package getPackage()

获取此类的包

(四)public String getName()

String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。

(五)public String getSimpleName()

以字符串形式返回此Class对象所表示的类的简称

(六)public Class<? super T> getSuperclass()

返回该Class所表示的类的超类对应的Class对象

技术分享

技术分享

八、判断Class对象对应的类是否为接口、枚举、注释类型

(一)public boolean isAnnotation()

如果此类对象表示一个注释类型,则返回 true;否则返回 false

(二)public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)

判断此Class对象是否使用了Annotation注释修饰

(三)public boolean isAnonymousClass()

返回此Class对象是否是一个匿名类

(四)public boolean isArray()

返回此Class对象是事表示一个数组类

(五)public boolean isEnum()

返回此Class对象是否是一个枚举

(六)public boolean isInterface()

判定指定的 Class 对象是否表示一个接口类型。

(七)public boolean isInstance(Object obj)

判断obj是否是此Class对象的实现,该方法可以完全代替instanceof操作符

技术分享

九、练习

这节课我们学习很多方法,如果一时记不住也没有关系,要养成使用api的习惯。

(一)需求:获取Person的信息

在控制台输出Person类的详细信息,包括全部方法、属性、指定方法和属性、全部及指定多个参数的构造方法、内部类、外部类、父类、所在包。

(二)Person类

技术分享













以上是关于跟王老师学反射:Class类:从Class类中获取信息的主要内容,如果未能解决你的问题,请参考以下文章

跟王老师学反射:Class类:获得Class对象

跟王老师学反射:使用反射调用方法

跟王老师学注解:利用反射读取注解信息

反射获取类中的方法

Java 反射

反射 注解 XML总结