关于Java内部类

Java允许成员类(在其他类内定义的类),局部类(在语句块内定义的类)和匿名类(无名称的类):

class Outer {Object anonymous = new Object(){}; // this is an anonymous class// anonymous initialisation block{// this is a local classclass Local{}Local l = new Local();}Outer() {// this is a local named class in a constructorclass Local{}Local l = new Local();}void method() {// this is a local named class in a methodclass Local{}Local l = new Local();}// this is a member classclass Inner{}Inner i = new Inner();
}

Java语言规范将成员,本地和匿名类分类为内部类

实施“细节”

Java语言或虚拟机规范没有告诉您的是它们是如何实现的。 其他文章已经对此进行了解释,例如Java编译器如何生成综合方法以允许这些成员类访问私有字段,而JVM不允许这样做。

易于理解的内部类的另一个实现细节是内部类的构造函数采用额外的综合参数。 相对众所周知 ,内部类构造函数的第一个综合参数将是其封闭实例,并将其存储在this$X综合字段中。 这对所有三种内部类均有效:成员,本地和匿名。

但是通常不知道捕获非恒定最终变量的本地类是否要求将所有这些变量作为额外的综合构造函数参数传递(捕获的常数最终变量将被内联并且不会生成额外的综合构造函数参数):

class Outer {void method() {final String constant = "foo";final String nonConstant = "foo".toUpperCase();class Local{/* synthetic fields and constructor:Outer this$0;String nonConstant;Local(Outer this$0, String nonConstant){this.this$0 = this$0;this.nonConstant = nonConstant;}*/}Local l = new Local();}
}

好的,但是我为什么要关心呢?

在大多数情况下,除了您自己的好奇心之外,您根本不在乎。 但是,如果您正在使用内部类进行Java反射,那么您应该了解一些事情,并且由于我还没有在线找到或列出它们,所以我认为列出一系列可以帮助他人理解的事情很重要。因为不同的编译器将在Java Reflection API中产生不同的结果。

问题是当您使用Java反射为内部类构造函数获取java.lang.reflect.Constructor实例时会发生什么? 特别是,允许​​您访问参数类型(前泛型: getParameterTypes() ),通用参数类型(后泛型: getGenericParameterTypes() )和注释( getParameterAnnotations() )以及答案的方法会发生什么?是: 这取决于

假设以下Java类:

class Outer {class Inner {Inner(){}Inner(String param){}Inner(@Deprecated Integer param){}}
}

这是我们的每个构造函数上这三种反射方法返回的数组的大小,以及它们根据所使用的Java编译器的不同而有所不同:

外层内部类 .getDeclaredConstructor() 外层内部类 .getDeclaredConstructor( String.class) 外层内部类 .getDeclaredConstructor( Integer.class)
getParameterTypes() 。长度 1个 2 2
getGenericParameterTypes() .length用Eclipse编译 1个 2 2
getGenericParameterTypes() .length用Javac编译 0 1个 1个
getParameterAnnotations() 。长度 1个 2 1个

如您所见,合成参数始终包含在getParameterTypes() ,但仅在使用Eclipse进行编译时才包含在getGenericParameterTypes()

另一方面, getParameterAnnotations()将始终包含合成参数,除非注释了至少一个构造函数参数。

通过此信息,您现在了解了这些方法的结果之间的差异,但是到目前为止,我仍然没有找到确定哪个参数是合成参数的方法,因为尽管您可以对this$X合成做出很好的猜测参数,这是每个内部类都需要的,因此您无法知道将捕获为局部类构造函数的综合参数的非常量捕获变量的数量。

参考: Ceylon Team博客博客中的JCG合作伙伴 Stef Epardaud提供了带有内部类构造函数参数的Java反射奇数。

翻译自: https://www.javacodegeeks.com/2013/05/java-reflection-oddities-with-inner-class-constructor-parameters.html

具有内部类构造函数参数的Java Reflection奇数相关推荐

  1. java构造函数内部调用_具有内部类构造函数参数的Java Reflection奇数

    java构造函数内部调用 关于Java内部类 Java允许成员类(在其他类内定义的类),局部类(在语句块内定义的类)和匿名类(无名称的类): class Outer {Object anonymous ...

  2. Java Reflection (JAVA反射) 选择自 leek2000 的 Blog

    Java Reflection (JAVA反射)   作者:  corlin 日期:  04-05-10 10:32 点击数:  748   Reflection 是 Java 程序开发语言的特征之一 ...

  3. 注解和反射详细笔记。自定义注解,元注解,内置注解。反射机制,Java Reflection,Java内存分析,反射操作注解,java.lang.reflect.Method,Class

    文章目录 注解 什么是注解 内置注解 元注解 自定义注解 反射机制 静态语言 vs 静态语言 Java Reflection 反射相关的主要API Class类 Java内存分析 创建运行时类的对象 ...

  4. java reflection list_Java Reflection(九):泛型

    我常常在一些文章以及论坛中读到说Java泛型信息在编译期被擦除(erased)所以你无法在运行期获得有关泛型的信息.其实这种说法并不完全正确的,在一些情况下是可以在运行期获取到泛型的信息.这些情况其实 ...

  5. Java Reflection(九):泛型

    原文地址 作者: Jakob Jenkov 译者:叶文海(yewenhai@gmail.com) 内容索引 运用泛型反射的经验法则 泛型方法返回类型 泛型方法参数类型 泛型变量类型 我常常在一些文章以 ...

  6. 如何在Java Reflection中的类下获取所有方法信息?

    本文以我以前的文章为基础 . 在本文中,我们将看到如何使用Java Reflection检索类相关信息. 我们将重点介绍方法名称. 注意:我将创建一个单独的反射器实用程序类,在该类中,我们在其构造函数 ...

  7. java unlimited_具有无限参数的Java方法(Java method with unlimited arguments)

    具有无限参数的Java方法(Java method with unlimited arguments) Spring框架使用方法,您可以根据需要传递尽可能多的参数. 我想写一个函数,也可以采取无限量的 ...

  8. python函数type的用意_Python中type的构造函数参数含义说明

    测试代码如下: 复制代码 代码如下: class ModelMetaClass(type): def __new__(cls,name,base,attrs): logging.info(" ...

  9. java 输入 方程,用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a、b及c从命令行做参数输入 java...

    题目: 用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a.b及c从命令行做参数输入 java 答案参考: 以下程序在jdk5.0测试通过 import java.util.Sca ...

最新文章

  1. c#程序设定使用期限_C# 给某个方法设定执行超时时间
  2. Exchange2010SP1配置OWA下次登录时更改密码提醒
  3. Darwin Stream server(DSS服务器)的Relay(中继/转发)设置
  4. [Rails.Test.Prescriptions]系列之一:0基础的Test Rails...
  5. CentOS的改变系统启动级别
  6. 【机器学习基础】前置知识(四):一文掌握Pandas用法
  7. delphi7aes加密解密与java互转_Java 加密/解密Excel
  8. javascript基础--数组排序
  9. 这些年我对微服务的理解
  10. c++ windows下declspec
  11. 【Spark工作原理】Spark任务调度理解
  12. 《疯狂的站长》读后感3
  13. Genotype陨石的秘密
  14. 【优化求解】基于NSGAII算法求解含约束多目标优化问题matlab代码
  15. 2021-05-29当微商怎么引流?微商如何利用闲鱼引流?
  16. Android自定义相机镂空遮罩
  17. SLAM视觉里程计的理解
  18. Python网页爬虫工具有哪些?
  19. JSM之ActivityMQ
  20. 微信小程序中页面引入js文件

热门文章

  1. 设计模式入门(策略模式)
  2. apache.camel_Apache Camel 3.1 –即将推出更多骆驼核心优化
  3. jstat分析_jstat –分析
  4. 使用文本编辑器和jdk_JDK 14:记录,文本块等
  5. java 多线程和并行编程_Java 8中的并行和异步编程
  6. jrebel gradle_JRebel适用于Gradle Spring Boot应用程序
  7. java ee的小程序_扩展Java EE应用程序的基础
  8. spring解密_在运行时更新代码(已Spring解密)
  9. git hok json_从战中反弹:将Git提交信息作为JSON返回
  10. Log4j Bug –减慢您的应用程序