Java反射-1
2021/9/7 22:36:24
本文主要是介绍Java反射-1,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.基本概念
a.编译器与运行期
- 编译期:把源码交给编译器编译成计算机可以执行的文件的过程(Java代码编程.class文件的过程),只是做了一些翻译功能。
- 运行期:将编译后的文件交给计算机执行直至程序运行结束。(在磁盘中的代码放到内存中执行起来)
b.Java反射机制概念及作用
-
Java反射机制: 动态获取信息以及动态调用对象方法的功能。在运行状态中,对于任意一个类,都能知道这个类的所有属性以及方法;对于任意一个对象,都能够调用它的任意方法和属性。
-
Java反射机制在服务器程序和中间件程序中应用广泛(服务器端根据客户请求动态调用某个对象的特定方法)。
c.Java反射机制提供的主要功能
- 运行时判断任意一个对象所属的类。
- 运行时构造任意一个类的对象。
- 运行时判断任意一个类所具有的成员变量和方法。
- 运行时调用任意一个对象的方法。
- 生成动态代理。(关于动态代理见 https://www.jianshu.com/p/9bcac608c714)
下表:反射可访问的常用信息
d.Java反射机制的优缺点
优点
- 能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性
- 与Java动态编译相结合,可以实现无比强大的功能
- 对于Java这种先编译后运行的而语言,能让我们很方便的创建灵活的代码。这些代码可以在运行时装配,无需在组件之间进行源代码的连接,更加容易实现面向对象。
缺点
- 反射会消耗一定的系统资源(不需动态创建对象时不必使用反射)
- 反射调用方法时可以忽略权限检查获取类的私有方法和属性,可能会破环类的封装性导致安全问题。
2.Java反射机制API
java.lang.Class类(实现反射的关键所在)
- Class类的一个实例表示Java的一种数据类型(类、接口、枚举、注解、数组、基本数据类型、void)。Class无公有构造方法,Class实例是由JVM在类加载时自动创建的。
获取Class实例的方法
- 每一种类型(类、接口)都有一个class静态变量可以获得Class实例
Class clz1 = String.class;
- 每一个对象都有getClass()方法获得Class实例(Object类提供的实例方法)
String str = "Hello"; Class clz2 = str.getClass();
java.lang.reflect包
- 该包提供了反射用到的类,主要类说明如下:
- Constructor类:提供类的构造方法信息
- Field类:提供类或接口中成员变量信息
- Method类:提供类或接口成员方法信息
- Array类:提供了动态创建和访问Java数组的方法
- Modifier类:提供类和成员访问修饰符信息
代码实例(forName(String))创建某个类的运行时对象,若无则抛出ClassNotFoundException异常
//动态加载String类的运行时对象 Class c = Class.forName("java.lang.Integer"); //获取成员方法集合 Method[] methods = c.getDeclaredMethods(); //遍历成员方法集合 for(Method method: methods){ //打印修饰符 System.out.println(Modifier.toString(method.getModifiers())); //打印返回值类型名 System.out.println(method.getReturnType().getName() + " "); //打印方法名 System.out.println(method.getName() + " "); System.out.println();
3.Java通过反射访问构造方法
- 为动态获取对象构造方法的信息,首先需创建一个Constructor类型的对象或数组via下列方法之一
- getConstructors()
- getConstructors(Class<?>...parameterTypes)
- getDeclaredConstructors()
- getDeclaredConstructor(Class<?>...parameterTypes)
注:若访问指定的构造方法,需根据该构造方法的入口参数的类型来访问。
eg访问一入口参数为int和String类型的构造方法
objectClass.getDeclaredConstructor(int.class, String.class)
创建的Constructor对象标识一个构造方法,然年后利用Constructor对象的方法操作构造方法。常用方法如下:
对于getModifiers()方法,通过java.lang.reflect.Modifier类可以解析出该方法的返回值所表示的修饰符信息。
在该类中提供了一系列用来解析的静态方法,既可以查看是否被指定的修饰符修饰,还可以字符串形式获得所修饰符。
4.Java通过反射执行方法(获取方法)
- 要动态获取一个对象方法的信息,需通过下列方法之一创建一个Method类型的对象或数组。
- getMethods()
- getMethods(String name,Class<?>...parameterTypes)
- getDeclaredMethods()
- getDeclaredMethods(String name,Class<?>...parameterTypes)
Method类常用方法如下
注:invoke需先指定对象obj eg.
test1 a = new test1("Mike", 22);
Object obj = method.invoke(a, "baby", "I");
5.Java通过反射访问成员变量
- 通过下列方法访问成员变量时将返回Field类型的对象或数组
- getFields()
- getField(String name)
- getDeclaredFields()
- getDeclaredField(String name)
Field类常用方法如下:
这篇关于Java反射-1的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11有哪些好用的家政团队管理工具?
- 2025-01-11营销人必看的GTM五个指标
- 2025-01-11办公软件在直播电商前期筹划中的应用与推荐
- 2025-01-11提升组织效率:上级管理者如何优化跨部门任务分配
- 2025-01-11酒店精细化运营背后的协同工具支持
- 2025-01-11跨境电商选品全攻略:工具使用、市场数据与选品策略
- 2025-01-11数据驱动酒店管理:在线工具的核心价值解析
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide
- 2025-01-11不得不了解的高效AI办公工具API