五分钟理解Java的反射API 客官°小女子只卖身不卖艺 2022-06-16 14:14 160阅读 0赞 ## 反射API ## [Java][]是一种具有反射功能的语言。允许开发人员在运行时检查类型、方法、字段、注解等,并在程序运行时决定是否使用。 为此,Java的反射API提供类,类,字段,构造函数,方法,注释和其他。 使用它们可以与编译时未知的类型进行交互,例如创建未知类的实例并对它们调用方法。 这个快速提示旨在让您深度了解什么是反射,它在Java中的使用,以及它可以用于什么。 之后,你将准备好开始或工作更长的教程。 为了充分使用它,你应该很好地理解Java的类构造器,特别是什么类和方法以及它们如何关联。 了解注释可解锁单独的部分。 ## 举个栗子 ## 我们从一个简单的Java代码开始(代码针对有一定java基础的阅读人员) URL url = new URL("https://sitepoint.com/java"); String urlString = url.toExternalForm(); System.out.println(urlString); 我决定*在编译时*(即当我在写代码时)创建一个`URL对象,并且调用了其中的一些方法。下面演示了我使用Java的反射API完成了同样的事情:` // the gateway to reflection is the `Class` instance // for the class you want to operate on Class<?> type = Class.forName("java.net.URL"); // fetches the constructor that takes a `String` argument // and uses it to create a new instance for the given string Constructor<?> constructor = type.getConstructor(String.class); Object instance = constructor.newInstance("https://sitepoint.com/java"); // fetches the `toExternalForm` method and invokes it on // the instance that was just created Method method = type.getMethod("toExternalForm"); Object methodCallResult = method.invoke(instance); System.out.println(methodCallResult); 使用反射API的确比直接写代码要笨重一点. 但是使用反射你会发现, 你在代码当中的调用细节 (比如说我用的URL这个类以及我调用其中的方法) 变成了仅仅一个参数. 结果呢,在编译期间URL以及toExternalForm并没有绑定, 它们是在程序开始运行的时候才被决定绑定的 反射的大多数用例都是“框架”的场景下 ,想想junit, 比如说, 执行所有被@ test注解的方法. 一旦框架在classpath扫描的时候找到注解它就会调用getMethod以及invoke函数去执行用户代码. [spring][]和其他的一些web框架在搜索控制器以及url映射的收也差不多是这么做的,对可扩展的应用程序来说反射的另外一个用途就是在运行时加载用户提供的插件 ## ## ## 基本类型和方法 ## 调用反射API的方法是Class :: forName。 在它的简单形式中,这个静态方法只需要一个完全限定的类名,并为它返回一个Class实例。 该实例可用于获取字段,方法,构造函数等。 通过构造器函数获取类对象,getConstructor方法可以使用构造函数参数的类型调用,就像我上面做的那样。 类似地,可以通过调用getMethod并传递其名称以及参数类型来访问特定方法。 上面的getMethod(“toExternalForm”)调用没有指定任何类型,因为该方法没有参数。 这里有一个方法: Class<?> type = Class.forName("java.net.URL"); // `URL::openConnection` has an overload that accepts a java.net.Proxy Method openConnection = type.getMethod("openConnection", Proxy.class); 这些调用返回的实例分别是Constructor和Method类型。 要调用底层成员,他们提供类似于Constructor :: newInstance和Method :: invoke的方法。 后者的一个有趣的细节是,要调用该方法的实例需要作为第一个参数传递给它(它指类的实例)。 其他参数将被传递给被调用的方法。 继续openConnection示例: openConnection.invoke(instance, someProxy); 如果要调用静态方法,则将忽略实例参数,因此可以为null。 ## ## ## 注解 ## 注解是反射的重要组成部分。 事实上,注解主要针对反射。 它们旨在提供程序运行时访问的元信息,然后用于塑造程序的行为。 (如上所述,JUnit的@Test和Spring的@Controller和@RequestMapping是很好的例子。) 所有重要的反射相关类型,如类,字段,构造函数,方法和参数实现AnnotatedElement接口。 链接的Javadoc包含了注释如何与这些元素(直接呈现,间接呈现或关联)相关的详细解释,但是它最简单的形式是:getAnnotations方法以注释实例数组的形式返回该元素上存在的注释 ,然后可以访问其成员。 ## ## ## 总结 ## Java的反射API允许在运行时自动检查类型,方法,注释等,并调用在编译时未知的构造函数和方法。首先,请调用 `Class.forName("fully.qualified.class.Name")` ,然后调用`getConstructors`, `getMethods`, `getAnnotations`或类似方法。调用伴随构造函数的`newInstance`和方法的`invoke一起发生` 。 你也可以使用[反射分解代码][Link 1]并更改非公共字段或调用非公共方法 - 这是一个冒险的做法,而且[在Java 9中变得更加困难][Java 9]。如果你很好奇,并希望知道所有的API的来龙去脉,[在Java的官方文档中给出了反射线索][Java 1]。到目前为止,API有点过时并有一些缺点,但是新的替代方案存在,查看[方法句柄][Link 2](自Java 7)和[变量句柄][Link 3](自[Java ][Java 2]9)。 [Java]: http://lib.csdn.net/base/javase [spring]: http://lib.csdn.net/base/javaee [Link 1]: http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html [Java 9]: https://www.sitepoint.com/reflection-vs-encapsulation-in-the-java-module-system/ [Java 1]: http://docs.oracle.com/javase/tutorial/reflect/index.html [Link 2]: http://stackoverflow.com/questions/8823793/methodhandle-what-is-it-all-about [Link 3]: http://openjdk.java.net/jeps/193 [Java 2]: http://lib.csdn.net/base/java
相关 反射机制理解:使用Java反射API的一个实用案例 Java反射机制是Java语言中的一种特性,允许程序在运行时检查类的信息,如方法、字段等,并可以动态调用这些方法或者访问字段。 以下是一个简单的反射机制理解的实用案例: ` 梦里梦外;/ 2024年09月18日 08:51/ 0 赞/ 2 阅读
相关 Java反射API:理解和应用实例 Java的反射API(Reflection API)是一种强大的工具,它允许我们在运行时获取和操作类的信息,包括方法、属性等。 以下是一些理解和应用反射API的例子: 1. 港控/mmm°/ 2024年09月17日 17:24/ 0 赞/ 7 阅读
相关 Java反射API如何理解并应用 Java反射API是一种允许程序在运行时动态地获取类的信息,如方法、字段等,并可以动态调用这些方法或者访问这些字段。 理解和应用反射API主要包括以下几个步骤: 1. ** 今天药忘吃喽~/ 2024年09月16日 06:04/ 0 赞/ 6 阅读
相关 理解Java反射API及其潜在风险 Java反射API是Java语言的一个重要特性,它允许程序在运行时检查类、方法和字段等信息,并动态调用它们。 理解和使用反射API有以下几个方面: 1. **获取对象信息* 素颜马尾好姑娘i/ 2024年09月15日 23:00/ 0 赞/ 9 阅读
相关 Java反射API:理解和避免的问题 Java的反射API(Reflection API)允许程序在运行时获取类的信息,如方法、字段等。这种能力非常强大,但也存在一些问题和潜在风险,下面是一些理解和避免的问题: 本是古典 何须时尚/ 2024年09月12日 00:09/ 0 赞/ 20 阅读
相关 五分钟理解Java的反射API [原文地址点击此处][Link 1] 反射API java是一种具有反射功能的语言。允许开发人员在运行时检查类型、方法、字段、注解等,并在程序运行时决定 矫情吗;*/ 2022年09月30日 10:00/ 0 赞/ 121 阅读
相关 五分钟理解Java的反射API 反射API [Java][]是一种具有反射功能的语言。允许开发人员在运行时检查类型、方法、字段、注解等,并在程序运行时决定是否使用。 为此,Java的反射API提供类,类 客官°小女子只卖身不卖艺/ 2022年06月16日 14:14/ 0 赞/ 161 阅读
相关 10分钟理解Java反射机制 ![Image 1][]概述 Java 反射是可以让我们在运行时获取类的方法、属性、父类、接口等类的内部信息的机制。也就是说,反射本质上是一个“反着来”的过程。我们通过n 川长思鸟来/ 2022年05月29日 05:53/ 0 赞/ 193 阅读
相关 总结: 十分钟深入理解Java反射机制 首先先看一下Java反射的概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取 叁歲伎倆/ 2022年05月28日 05:23/ 0 赞/ 186 阅读
还没有评论,来说两句吧...