反射
反射是框架设计的灵魂
概述
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述
理解
Class
Class是一个类,封装了当前对象所对应的类的信息
public final class Class extends Object implements Serializable, GenericDeclaration, Type, AnnotatedElement
概述
Class
类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象。(包括基本数据类型)
Class
没有公共构造方法。Class
对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass
方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了。
. 小写class表示是一个类类型,大写Class表示这个类的名称
创建
1.通过类名获取 类名.class
2.通过对象获取 对象名.getClass()
3.通过全类名获取 Class.forName(全类名)
常见方法
-
-
类
asSubclass(类 clazz)
类
这个类
对象来表示由指定的类对象表示的类的子类。T
cast(Object obj)
施放一个目的是通过本表示的类或接口类
对象。boolean
desiredAssertionStatus()
如果要在调用此方法时初始化该类,则返回将分配给此类的断言状态。static 类
forName(String className)
返回与给定字符串名称的类或接口相关联的类
对象。static 类
forName(String name, boolean initialize, ClassLoader loader)
使用给定的类加载器返回与给定字符串名称的类或接口相关联的类
对象。AnnotatedType[]
getAnnotatedInterfaces()
返回一个AnnotatedType
对象的数组,AnnotatedType
使用类型指定由此AnnotatedType
对象表示的实体的超级类
。AnnotatedType
getAnnotatedSuperclass()
返回一个AnnotatedType
对象,该对象表示使用类型来指定由此类
对象表示的实体的类
类。A
getAnnotation(类 annotationClass)
返回该元素的,如果这样的注释 *,*否则返回null指定类型的注释。Annotation[]
getAnnotations()
返回此元素上 存在的注释。A[]
getAnnotationsByType(类 annotationClass)
返回与此元素相关 联的注释 。String
getCanonicalName()
返回由Java语言规范定义的基础类的规范名称。类[]
getClasses()
返回包含一个数组类
表示所有的公共类和由此表示的类的成员接口的对象类
对象。ClassLoader
getClassLoader()
返回类的类加载器。类
getComponentType()
返回类
数组的组件类型的Class。Constructor
getConstructor(类... parameterTypes)
返回一个Constructor
对象,该对象反映Constructor
对象表示的类的指定的公共类
函数。Constructor[]
getConstructors()
返回包含一个数组Constructor
对象反射由此表示的类的所有公共构造类
对象。A
getDeclaredAnnotation(类 annotationClass)
如果这样的注释 直接存在 ,则返回指定类型的元素注释,否则返回null。Annotation[]
getDeclaredAnnotations()
返回 直接存在于此元素上的注释。A[]
getDeclaredAnnotationsByType(类 annotationClass)
如果此类注释 直接存在或 *间接存在,*则返回该元素的注释(指定类型)。类[]
getDeclaredClasses()
返回一个反映所有被这个类
对象表示的类的成员声明的类和类
对象的数组。Constructor
getDeclaredConstructor(类... parameterTypes)
返回一个Constructor
对象,该对象反映Constructor
对象表示的类或接口的指定类
函数。Constructor[]
getDeclaredConstructors()
返回一个反映Constructor
对象表示的类声明的所有Constructor
对象的数组类
。Field
getDeclaredField(String name)
返回一个Field
对象,它反映此表示的类或接口的指定已声明字段类
对象。Field[]
getDeclaredFields()
返回的数组Field
对象反映此表示的类或接口声明的所有字段类
对象。方法
getDeclaredMethod(String name, 类... parameterTypes)
返回一个方法
对象,它反映此表示的类或接口的指定声明的方法类
对象。方法[]
getDeclaredMethods()
返回包含一个数组方法
对象反射的类或接口的所有声明的方法,通过此表示类
对象,包括公共,保护,默认(包)访问和私有方法,但不包括继承的方法。类
getDeclaringClass()
如果由此类
对象表示的类或接口是另一个类的成员,则返回表示其声明的类的类
对象。类
getEnclosingClass()
返回底层类的即时封闭类。Constructor
getEnclosingConstructor()
如果此类
对象表示构造函数中的本地或匿名类,则返回表示底层类的立即封闭构造函数的Constructor
对象。方法
getEnclosingMethod()
如果此类
对象表示方法中的本地或匿名类,则返回表示基础类的即时封闭方法的方法
对象。T[]
getEnumConstants()
返回此枚举类的元素,如果此Class对象不表示枚举类型,则返回null。Field
getField(String name)
返回一个Field
对象,它反映此表示的类或接口的指定公共成员字段类
对象。Field[]
getFields()
返回包含一个数组Field
对象反射由此表示的类或接口的所有可访问的公共字段类
对象。Type[]
getGenericInterfaces()
返回Type
表示通过由该对象所表示的类或接口直接实现的接口秒。Type
getGenericSuperclass()
返回Type
表示此所表示的实体(类,接口,基本类型或void)的直接超类类
。类[]
getInterfaces()
确定由该对象表示的类或接口实现的接口。方法
getMethod(String name, 类... parameterTypes)
返回一个方法
对象,它反映此表示的类或接口的指定公共成员方法类
对象。方法[]
getMethods()
返回包含一个数组方法
对象反射由此表示的类或接口的所有公共方法类
对象,包括那些由类或接口和那些从超类和超接口继承的声明。int
getModifiers()
返回此类或接口的Java语言修饰符,以整数编码。String
getName()
返回由类
对象表示的实体(类,接口,数组类,原始类型或空白)的名称,作为String
。软件包
getPackage()
获取此类的包。ProtectionDomain
getProtectionDomain()
返回ProtectionDomain
。URL
getResource(String name)
查找具有给定名称的资源。InputStream
getResourceAsStream(String name)
查找具有给定名称的资源。Object[]
getSigners()
获得这个类的签名者。String
getSimpleName()
返回源代码中给出的基础类的简单名称。类
getSuperclass()
返回类
表示此所表示的实体(类,接口,基本类型或void)的超类类
。String
getTypeName()
为此类型的名称返回一个内容丰富的字符串。TypeVariable<类>[]
getTypeParameters()
返回一个TypeVariable
对象的数组,它们以声明顺序表示由此GenericDeclaration
对象表示的通用声明声明的类型变量。boolean
isAnnotation()
如果此类
对象表示注释类型,则返回true。boolean
isAnnotationPresent(类 annotationClass)
如果此元素上 存在指定类型的注释,则返回true,否则返回false。boolean
isAnonymousClass()
返回true
当且仅当基础类是匿名类时。boolean
isArray()
确定此类
对象是否表示数组类。boolean
isAssignableFrom(类 cls)
确定由此类
对象表示的类或接口是否与由指定的Class类
表示的类或接口相同或是超类或类
接口。boolean
isEnum()
当且仅当该类在源代码中被声明为枚举时才返回true。boolean
isInstance(Object obj)
确定指定的Object是否与此Object
表示的对象分配类
。boolean
isInterface()
确定指定类
对象表示接口类型。boolean
isLocalClass()
返回true
当且仅当基础类是本地类时。boolean
isMemberClass()
返回true
当且仅当基础类是成员类时。boolean
isPrimitive()
确定指定类
对象表示一个基本类型。boolean
isSynthetic()
如果这个类是一个合成类,返回true
; 返回false
其他。T
newInstance()
创建由此类
对象表示的类的新实例。String
toGenericString()
返回描述此类
的字符串,包括有关修饰符和类型参数的信息。String
toString()
将对象转换为字符串。
-
常用相关类
ClassLoader
public abstract class ClassLoader extends Object
类加载器是负责加载类的对象。 ClassLoader
类是一个抽象类。 给定一个类的binary name ,类加载器应该尝试定位或生成构成类的定义的数据。 典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的“类文件”。
``InputStream
getResourceAsStream(String name)
返回用于读取指定资源的输
Field
public final class Field extends AccessibleObject implements Member
Field
提供有关类或接口的单个字段的信息和动态访问。public void setAccessible(boolean flag) throws SecurityException
将此对象的
accessible
标志设置为指示的布尔值。true
的值表示反射对象应该在使用时抑制Java语言访问检查。false
的值表示反映的对象应该强制执行Java语言访问检查。
get(Object obj) 获得obj中对应的属性值 set(Object obj, Object value) 设置obj中对应属性值
Method
public final class Method extends Executable
方法
提供有关类和接口上单一方法的信息和访问权限。 反映的方法可以是类方法或实例方法(包括抽象方法)。
public Object invoke(Object obj, Object… args) throws IllegalAccessException,IllegalArgumentException,
InvocationTargetException在具有指定参数的
方法
对象上调用此方法
对象表示的基础方法。个别参数自动解包以匹配原始形式参数,原始参考参数和参考参数都需要进行方法调用转换。如果底层方法是静态的,则指定的
obj
参数将被忽略。 它可能为null。如果底层方法所需的形式参数的数量为0,则提供的
args
数组的长度为0或为空。
Constructor
public final class Constructor extends Executable
Constructor
提供了一个类的单个构造函数的信息和访问。
public T newInstance(Object… initargs) throws InstantiationException, IllegalAccessException,
IllegalArgumentExceptio , InvocationTargetException使用由此
Constructor
对象表示的构造函数,使用指定的初始化参数创建和初始化构造函数的声明类的新实例。个别参数自动解包以匹配原始形式参数,原始参考参数和参考参数都需要进行方法调用转换。如果底层构造函数所需的形式参数的数量为0,则提供的
initargs
数组的长度为0或为空。