Java 反射与Java反射的常用方法总结

RTIT(Run-time type identification) 运行时类型识别。 在运行时识别我们对象的类型和信息。在Java中一般通过反射在运行时发现对象的类型已经使用对象的类型信息。

反射就是把Java类的各个部分映射成为一个个Java对象

例如:一个类有成员变量,构造方法,包,接口,方法等信息,利用反射可以把这些部分映射成一个个Java对象。

Class 类,Class 类的实例表示Java应用运行时类或者接口的类型信息对象(可通过类目.class或队长.getClass(), Class.forName("全限定类名")来获取class对象)

注意:手动编写的一个类被编译后会生成一个class对象,这个对象被保存在.class文件(字节码)里。

下面说一下反射中常用的方法:

获取Class 类对象:

更具类目: 类目.class

更具对象: 对象.getClass()

更具类的全类名: Class.forName("全路径名)

更具类加载器: 类加载器.loadClass()

一个类的Class对象只要类被加载了就是唯一的,上述4个方法都会返回唯一的Class对象。其中后面两个方法如果类没有被加载的话会加载嘞,loadClass方法不会执行static 代码块里面的代码,forName默认会执行static代码块但是也可以设置参数不执行。

常用的Class对象的方法如下所示

getName()获取类权限定名
getSimpleName()获取类名
getCanonicalName()获取全限定的类名(包括包名)
isInterface()判断Class对象是不是借口
getInterfaces()返回Class对象数组,表示当前Class对象所实现的所有借口
getSuperclass()返回Class对象,表当前Class对象直接继承的父类的Class对象
newInstance()用该类的无参构造方法构造一个该类的对象,返回一个Object类型对象,且该类必须有无参构造器
getFields()获得某个类被public修饰的字段对象(Field对象),包括所有父类public修饰公共字段。类似的还有getMethods 和getConstructors
getDeclaredFields

获得某个类自己声明的字段,包括public private proected 和defualt,但是不包括父类声明的任何字段。类似的还有getDeclaredMathods 和 getDeclaredConstructors。

注意⚠️:不包括父类的!!!!!!

Java反射中:像我刚才说的,几乎为每个类的类型信息都创建了一个对象,如 Method,Constructor,Field对象。 在调用 newInstanc()方法时有可能会出现illeageAccess 异常,这是因为无参构造方法 用private修饰就会抛出异常。

Constructor 类及其用法

方法返回值方法名称方法说明
ConstructorgetConstructor(Class<?>... parameterTypes) 返回参数指定类型的public修饰的构造器,参数为指定类型的Class对象
Constructor<?> []getConstructors()返回所有具有public的构造器
ConstructorgetDeclaredConstructor(Class<>>... parameterTypes)返回指定类型的所有(包括private)构造器
Constructor<?> []getDeclaredConstructor()返回所有声明的构造器(包括private修饰的)
TnewInstance()

调用无参数构造器构造此Class对象所表示类的对象

如果是用DeclaredConstructor获取的private修饰的构造器,还需要用构造器对象的setAccessible设置该构造器可以被访问

TnewInstance(里面传递参数Object)

如果获取的构造器对象是需要传递参数的,可以传递参数生成该Class对象所表示类的对象,同理如果是private修饰的构造器,在创建对象之前,需要setAccessible 否则会报错。

这个方法是Constrcutor对象里面的 不是class对象里面的,写在这里方便展示

Constructor类本身常用方法:

返回值方法名称方法说明
ClassgetDeclaringClass()返回一个class对象,就是该构造器对象所构造的对象的类的Class对象。
Type[]getGenericParameterTyoes()返回一组Type对象,代表该Constructor对象的构造函数的形式参数的类型。
StringgetName()返回构造方法的名称
Class<>[]getParameterType()返回一组class对象,这组class对象表示该构造器形式参数类型的构造器参数的类的Class对象
TnewInstance(Objects )用该构造器对象构造一个该构造器所表示的类型的对象,对象参数是该构造器所持有的参数
StringtoGenericString()返回描述这个构造器对象的字符串,包括类型参数(比getName多了类型参数)

Field类及其用法:

通过Class对象的提供的方法课或得Field对象,也就是用来描述类的属性信息。(包括实例成员变量,和类成员变量)

Class类与Field相关的方法如下:

方法返回值方法名称方法说明
FieldgetDeclaredField(String name)获取制定name的字段对象, 包含Private修饰的,不包括继承的
Field[]getDeclaredField()获取Class对象所表示的类或接口的所有字段对象,包含private,不包含继承父类的
FieldgetField(String name)获取指定name的被public修饰的字段对象,包括父类
Field[]getField()获取所有public修饰的包括父类继承的字段对象。

所有对private 修饰的字段的对象进行 和类的实例对象相关的操作的时候,都要设置accessible 为true,才能进行相关操作。

Field类的相关操作:

返回值方法名称方法说明
voidset(Object obj, Object value)将制定对象上此 Field对象所表示的实例字段的值设置为 value值,⚠️:value值的类型必须喝字段的对应,否则会爆出 Illeagl Access Exception
Objectget(Object obj)返回该obj对象上Field表示的字段的值
Class<?>getType()返回一个class对象,表示此Field对象所表示字段的类型,比如 public int String abc 则会返回abc的字段类型的Class对象 既返回 String 的Class对象
boolean isEnumConstant()判断该Field对象所表示的字段是不是枚举类型
String toGenericString()返回一个描述此Field对象的字符串
StringgetName()返回次Field对象所表示的字段名称 如“abc”
Class<?>getDeclaringClass()返回该Field对象所在类的Class对象
voidsetAccessible(boolean flag)将该Field对象的accessible标志设置为true,便表示可以用它对相关对象进行改写

著作权归https://pdai.tech所有。 链接:Java 基础 - 反射机制详解 | Java 全栈知识体系

上述方法可能是较为常用的,事实上在设置值的方法上,Field类还提供了专门针对基本数据类型的方法,如setInt()/getInt()setBoolean()/getBooleansetChar()/getChar()等等方法,这里就不全部列出了,需要时查API文档即可。需要特别注意的是被final关键字修饰的Field字段是安全的,在运行时可以接收任何修改,但最终其实际值是不会发生改变的。

Method类及其常用方法

Method类提供了 类的某一个方法(以及如何访问该方法)的信息,所反映的方法可能是实例方法或者类方法。

Class对象与Method对象的相关方法:

返回值方法名称方法说明
MethodgetDeclaredMethod(String name, Class<?>/// parameterTypes)返回一个指定参数的Method对象,name是method的名字, 后面的Class是参数类型的class对象
Method[]getDeclaredMathod()返回Method 数组,里面有所有的当前类方法Method对象包括(private)修饰的,但不包括继承的方法
MethodgetMethod(String name, Class<?>... parameterTypes)放回一个Method对象, 他表示此Class对象所表示的类或接口的制定的成员方法
Method[]getMethods()返回一个包含该类的所有方法的Method对象数组,包含父类的public修饰的方法,但是不包含非public修饰的方法,

Method对象的相关方法:

方法返回值方法名称方法说明
Objectinvoke(Object obj, Object..args)调用指定对象带有指定参数的由当前Method所描述的底层方法
Class<?>getReturnType()返回一个Class对象,该对象描述类此Method对象所表示的返回值的类型Class。
TypegetGenericReturnType()返回此Method对象所表示方法的正式返回类型的Type对象,也是方法的返回类型
Class<?>[]getParameterTypes()返回此Method对象所表示方法的形式参数的类型的Class对象组
Type[]getGenericParameterTypes()按照声明顺序返回Type对象的数组,这些对象描述了此Method对象所表示的方法的形式参数的类型
StringgetName()以String形式返回此Method一下表示方法的名称,既返回方法的名称
booleanisVarArgs()判断方法是否带可变参数,如果该mthod对象所表示的方法带有声明可变数量的参数,则返回true,否则false
StringtoGenericString()返回描述此Method的字符串,包括类型参数

注意Type类型是jdk8中新增的一个借口,有一个默认方法 getTypeName,返回toString()方法的结果。

getParameterTypes/getGenericParameeterType也是一个道理,都是获取Method对象所表示的方法的参数类型

参考来自:

Java 基础 - 反射机制详解 | Java 全栈知识体系

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值