java反射

一、什么是反射?

Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取t对象的各种信息。

二、反射的作用

  • 反编译从.class变为java对象

  • 获取java对象的属性、方法、构造方法

  • 开发各种通用框架,比如很多配置化信息,根据配置文件加载不同的类,调用不同的方法

三、反射的原理

类的正常加载过程是->编译(.class文件)、加载(jvm中)、连接(验证、准备、解析)、初始化

反射是在第二步从jvm中获取类的.class信息,通过反射方法回去.class中获取具体信息(属性、方法等)

四、反射的相关常用类

Java.lang.Class;
Java.lang.reflect.Constructor;
Java.lang.reflect.Field;
Java.lang.reflect.Method;
Java.lang.reflect.Modifier;

五、反射的使用

Modifier and Type

Method and Description

<U> <? extends U>

asSubclass(<U> 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 extends Annotation>
A

getAnnotation(<A> annotationClass)返回该元素的,如果这样的注释 否则返回null指定类型的注释。

Annotation[]

getAnnotations()返回此元素上 存在的注释。

<A extends Annotation>
A[]

getAnnotationsByType(<A> annotationClass)返回与此元素相关 联的注释

String

getCanonicalName()返回由Java语言规范定义的基础类的规范名称。

<?>[]

getClasses()返回包含一个数组 类表示所有的公共类和由此表示的类的成员接口的对象 类对象。

ClassLoader

getClassLoader()返回类的类加载器。

<?>

getComponentType()返回 类数组的组件类型的Class。

Constructor<T>

getConstructor(<?>... parameterTypes)返回一个 Constructor对象,该对象反映 Constructor对象表示的类的指定的公共 类函数。

Constructor<?>[]

getConstructors()返回包含一个数组 Constructor对象反射由此表示的类的所有公共构造 类对象。

<A extends Annotation>
A

getDeclaredAnnotation(<A> annotationClass)如果这样的注释 直接存在 ,则返回指定类型的元素注释,否则返回null。

Annotation[]

getDeclaredAnnotations()返回 直接存在于此元素上的注释。

<A extends Annotation>
A[]

getDeclaredAnnotationsByType(<A> annotationClass)如果此类注释 直接存在间接存在,则返回该元素的注释(指定类型)。

<?>[]

getDeclaredClasses()返回一个反映所有被这个 类对象表示的类的成员声明的类和 类对象的数组。

Constructor<T>

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()返回源代码中给出的基础类的简单名称。

<? super T>

getSuperclass()返回 类表示此所表示的实体(类,接口,基本类型或void)的超类 类 。

String

getTypeName()为此类型的名称返回一个内容丰富的字符串。

TypeVariable<<T>>[]

getTypeParameters()返回一个 TypeVariable对象的数组,它们以声明顺序表示由此 GenericDeclaration对象表示的通用声明声明的类型变量。

boolean

isAnnotation()如果此 类对象表示注释类型,则返回true。

boolean

isAnnotationPresent(<? extends Annotation> 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()将对象转换为字符串。

1、获取Class对象

  • 通过Class.forName("全类名")静态方法获取

Class c = Class.forName("mytest.reflect.Person");
  • 类名.class获取

Class c = Person.class;
  • 对象.getClass()获取

Person person = new  Person();
Class c = person.getClass();

2、判断是否为某个类的实例

使用Class对象的isInstance()方法,来判断是否为某个类的实例

Person person = new Person();
Class<Person> personClass = Person.class;
boolean instance = personClass.isInstance(person);

3、创建实例

  • 使用Class对象的newInstance()方法来创建Class对象对应类的实例。

Class<Person> personClass = Person.class;
Person person = personClass.newInstance();
  • 先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建对象,这种方法可以用指定的构造器构造类的实例。

Class<Person> personClass = Person.class;
Constructor<Person> constructor = personClass.getConstructor();
Person person = constructor.newInstance();

4、构造方法相关

Class<Person> personClass = Person.class;
//获取所有"公有的"构造方法
Constructor<?>[] constructors = personClass.getConstructors();
//获取所有的构造方法(包括私有、受保护、默认、公有)
Constructor<?>[] declaredConstructors = personClass.getDeclaredConstructors();
//获取某个的"公有的"构造方法
Constructor<Person> constructor = personClass.getConstructor(Class... parameterTypes);
//获取某个构造方法(包括私有、受保护、默认、公有)
Constructor<Person> declaredConstructor = personClass.getDeclaredConstructor(Class... parameterTypes);

5、成员变量相关

Person person = new Person();
Class<? extends Person> personClass = person.getClass();
//获取所有"公有的"成员变量
Field[] fields = personClass.getFields();
//获取所有的成员变量(包括私有、受保护、默认、公有)
Field[] declaredFields = personClass.getDeclaredFields();
//获取某个的"公有的"成员变量
Field field = personClass.getField("name");
//获取某个成员变量(包括私有、受保护、默认、公有)
Field declaredField = personClass.getDeclaredField("name");
//设置成员变量的值
field.set(person,"100");

6、获取成员方法

Person person = new Person();
Class<? extends Person> personClass = person.getClass();
//获取所有"公有的"成员方法
Method[] methods = personClass.getMethods();
//获取所有的成员方法(包括私有、受保护、默认、公有)
Method[] declaredMethods = personClass.getDeclaredMethods();
//获取某个的"公有的"成员方法
Method method = personClass.getMethod("receive",BigDecimal.class);
//获取某个成员方法(包括私有、受保护、默认、公有)
Method declaredMethod = personClass.getDeclaredMethod("receive",BigDecimal.class);
//调用方法
Object invoke = method.invoke(person, BigDecimal.valueOf(100));

7、反射main方法

Class<? extends Person> personClass = Person.class;
//获取main方法
Method method = personClass.getMethod("main", String[].class);
//调用方法
Object invoke1 = method.invoke(null, (Object) new String[]{"a", "b", "c"});

8、过反射越过泛型检查

List<String> strList = new ArrayList<>();
Class<? extends List> strListClass = strList.getClass();
Method method = strListClass.getMethod("add", Object.class);
method.invoke(strList, 100);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值