JAVA反射机制
Posted 一名Android小生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA反射机制相关的知识,希望对你有一定的参考价值。
Java反射机制是在运行状态中,对于任意一个类(class文件),都能知道这个类的所有属性和方法对于任意一个对象,都能够调用它的任意一个属性和方法。这种动态获取信息以及动态调用对象的方法的功能称为Java语言的反射机制简单理解为动态获取类中的信息就是Java反射。
实际上是对类的解剖。那么要想对字节码文件进行解剖。必须要获取字节码文件对象。那么如何获取字节码文件对象呢?
有如下三种方式
- 通过Object对象的getClass()方法,此方法需要明确具体的类,并且要创建该类的对象,比较麻烦
- 通过类名.class, 例如User.class,Person.class,这种方式相比第一种简单点,不过还是要明确类中的静态成员,不够扩展
- 通过Class.forName("完整的类名");这种方法比较方便,扩展性很强。
下面来介绍Class对象中的常用的一些方法
1.获取构造函数
- Constructor[] getConstructor(Class<?>...parameterTypes);返回此class对象对应类的、带指定形参列表的public构造器
- Constructor getConstructors();返回此class对象对应类的所有public构造器
- Constructor[] getDeclaredConstructor(Class<?>...parameterTypes);返回此class对象对应类的、带指定形参列表的构造器,与构造器的访问权限无关
- Constructor[] getDeclaredConstructors();返回此class对象对应类的所有构造器,与构造器的访问权限无关
2.获取成员方法
- Method getMethod(String methodName,Class<?>...parameterTypes) 返回此class对象对应类的、带指定形参列表的public方法
- Method getMethods() 返回此class对象对应类的所有public方法
- Method getDeclaredMethod(String methodName,Class<?>...parameterTypes) 返回此class对象对应类的、带指定形参列表的方法,与方法的访问权限无关
- Method getDeclaredMethods() 返回此class对象对应类的所有方法,与方法的访问权限无关
3.获取成员变量
- Field getField(String name) 返回此class对象对应类的、指定名称的public成员变量。
- Field getFields() 返回此class对象对应类的所有public成员变量。
- Field getDeclaredField(String name) 返回此class对象对应类的、指定名称的成员变量。与成员变量的访问权限无关
- Field getDeclaredFields() 返回此class对象对应类的所有成员变量。与成员变量的访问权限无关
4.小细节
- 通过Class对象的newInstance()方法可以用来创建对象,不过它默认调用的是无参的构造函数,当然我们想要创建指定参数的对象,可以通过构造器来创建,调用其newInstance方法
- 这里也要注意构造器的访问权限,私有的不能直接调用newInstance方法创建
- 通过Field的 set(Object obj,Object value)和 get(Object obj)可以设置成员变量的值和获取到成员变量的值。这里也要注意成员变量的访问权限,如果是private的不具备访问权限。这里可以通过
- setAccessible(true)来暴力访问
- 通过Method的invoke(Object obj,String methodName)可以动态的调用方法,同样也要注意方法的访问权限。私有的方法可以通过设置setAccessible(true)来暴力访问
- 通过class对象的getName()可以获取到完整的类名
- 通过class对象的getSimpleName()可以获取到简写类名
- 通过class对象的getPackage()获取到此类的包
5.注意
- Java提供的反射机制随便很方便的帮助我们动态获取类中的信息,但是也存在一些缺点:
- 丧失了编译时期类型检查的好处,包括异常检查,如果程序企图用反射的方式调用不存在的方法或者不可访问的方法,在运行时它会失败,除非用了比较好的预防措施
- 执行反射访问所需要的代码非常笨拙和冗长,编写这样的代码阅读性较差
- 性能损失,反射方法调用比普通方法调用慢了许多,具体慢多少受到各个因素的影响。
以上是关于JAVA反射机制的主要内容,如果未能解决你的问题,请参考以下文章