跟王老师学反射(四):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类

来自为知笔记(Wiz)

时间: 2024-10-03 23:15:37

跟王老师学反射(四):Class类:从Class类中获取信息的相关文章

跟王老师学反射(二):Java类的加载、连接和初始化

跟王老师学反射(二):Java类的加载.连接和初始化 主讲教师:王少华   QQ群号:483773664 学习内容: 了解类的加载.连接和初始化 一.类的生命周期 当我们编写一个java的源文件后,经过编译会生成一个后缀名为class的文件,这种文件叫做字节码文件,只有这种字节码文件才能够在java虚拟机中运行,java类的生命周期就是指一个class文件从加载到卸载的全过程.一个java类的完整的生命周期会经历加载.连接.初始化.使用.和卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直

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

跟王老师学反射(三):Class类:获得Class对象 主讲教师:王少华   QQ群号:483773664 学习内容 掌握获得Class对象的三种方式 理解这三种方式的区别 一.获得Class对象 前面我们已经领略了反射的魅力了,我们知道,利用反射的关键是要获得"图纸"Class对象,那么怎么获得这个Class对象呢!!! 每个类被加载之后,系统会为该类生成一个对应的Class对象,通过该Class对象就可以访问JVM中的这个类.Java程序获得Class对象有如下三种方式: (一)调

跟王老师学反射(十):静态代理模式

跟王老师学反射(十):静态代理模式 主讲教师:王少华   QQ群号:483773664 学习内容 理解代理机制 掌握静态代理 一.代理模式的概念 代理模式就是指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其他相关业务的处理. 代理模式一般涉及到三个角色 抽象角色:声明真实对象和代理对象的共同接口 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能替代真实对象相同的接口以便在任何时刻都能替代真实对

跟王老师学反射(一):反射概述

跟王老师学反射(一) java反射概述 主讲教师:王少华   QQ群号:483773664 学习目标: 理解Java反射机制 一.什么是Java反射 现实生活,我们会看到这样的现象,在很多影视城,会看到很多山寨版的古代的建筑,比如故宫,但是由于年代久远,故宫的建筑图纸,丢失了(我们假设故宫的图纸丢失了),这样我们就必须依据现在的故宫实体建筑,画出它的图纸,然后依据现画好来的图纸,来建造山寨版的故宫.这样一个由实物得到图纸的过程,我们也可以称之为"反射过程" Reflection(反射)

跟王老师学反射(五):使用反射生成并操作对象

跟王老师学反射(五):使用反射生成对象 主讲教师:王少华   QQ群号:483773664 学习内容 使用反射生成对象 模板类 一.创建对象 (一).非反射方法 (二).反射方式 通过构造方法生成对象,有二种方式,一种通过无参的构造方法,一种是通过有参的构造方法. 1.无参构造方法 1.1 如果无参数的构造方法是public 也可以使用Class对象的newInstance()方法来创建该Class对象对应类的实例 1.2 如果无参构造方法是私有化的 结论 如果无参构造访问,是私有化的,一定要使

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

跟王老师学反射(六):使用反射调用方法 主讲教师:王少华   QQ群号:483773664 学习内容 使用反射调用方法 当获得某个类对应的Class对象后,就可以通过该Class对象的getMethods()方法或getMethod()方法来获取全部方法或指定方法,这二个方法的返回值是Method对象数组,或者Method对象. 一.public Objectinvoke(Object obj,  Object... args) 获得Method对象后,程序就可以通过该Method来调用对应的方

跟王老师学反射(七)使用反射调用属性

跟王老师学反射(七):使用反射调用属性 主讲教师:王少华   QQ群号:483773664 学习内容 使用反射调用属性 通过Class对象的getFields()|getDeclaredFields()或getField()|getDeclaredField()方法可以获取该类所有包括的全部属性或指定的属性 一.Field类用于猎取类中的属性的方法 (一)getXxx(Object obj) 获取obj对象该Field的属性值,此处Xxx对应8个基本类型. (二)setXxx(Object ob

跟王老师学反射(八):使用反射操作数组

跟王老师学反射(八):使用反射操作数组 主讲教师:王少华   QQ群号:483773664 学习内容 使用反射操作数组 在java.lang.reflect包下还提供了一个Array类,Array对象可以代表所有的数组.程序可以通过使用Array来动态创建数组. 一.传统的创建数组的方法 1 2 3 4 5 6 7 8 public   static   void  main(String[] args)  {        int vec[] = new int[]{1, 5, 3};  //

跟王老师学反射(十一):动态代理

跟王老师学反射(十一):动态代理 主讲教师:王少华   QQ群号:483773664 学习内容 学会使用动态代理 一.动态代理 动态代理(Dynamic Proxy):相比上一节所实现的静态代理,动态代理具有更强的灵活性,因为它不用在我们设计实现的时候就指定某一个代理类来代理哪一个被代理对象,我们可以把这种指定延迟到程序运行时由JVM来实现. 动态代理(Dynamic proxies)是 Java 1.3 引入的特性,在Java的java.lang.reflect包下提供了一个Proxy类和一个