什么是Java中的合成类?为什么要使用它?我怎么用呢?
Java具有在运行时创建类的能力.这些类称为Synthetic Classes或Dynamic Proxies.
有关更多信息,请参见http://java.sun.com/j2se/1.5.0/docs/guide/reflection/proxy.html.
其他开源库(如CGLIB和ASM)也允许您生成合成类,并且比JRE提供的库更强大.
合成类由AOP(面向方面编程)库(如Spring AOP和AspectJ)以及ORM库(如Hibernate)使用.
好吧,我找到了谷歌第一个问题的答案:
如果类由编译器生成,则可以将其标记为合成类,也就是说,它不会出现在源代码中.
这只是一个基本的定义,但我发现它在一个论坛帖子中,并没有解释.还在寻找更好的......
例如,当你有一个switch语句时,java会创建一个以$开头的变量.如果你想看一个这样的例子,请查看其中包含switch语句的类的java反射.当您在类中的任何位置至少有一个switch语句时,您将看到这些变量.
为了回答你的问题,我不相信你能够访问合成类(除了反射).
如果您正在分析一个您不了解的类(通过反射)并且需要知道关于该类的非常具体和低级的事情,您最终可能会使用与合成类有关的Java反射方法.这里唯一的"使用"是获取有关该类的更多信息,以便在您的代码中正确使用它.
(如果你这样做,你可能正在构建一些其他开发人员可以使用的框架.)
否则,如果你没有使用反射,我所知道的合成类没有实际用途.
合成类/方法/领域:
这些对VM很重要.看看下面的代码片段:
class MyOuter { private MyInner inner; void createInner() { // The Compiler has to create a synthetic method // to construct a new MyInner because the constructor // is private. // --> synthetic "constructor" method inner = new MyInner(); // The Compiler has to create a synthetic method // to doSomething on MyInner object because this // method is private. // --> synthetic "doSomething" method inner.doSomething(); } private class MyInner { // the inner class holds a syntetic ref_pointer to // the outer "parent" class // --> synthetic field private MyInner() { } private void doSomething() { } } }
根据这个讨论,虽然语言规范描述了类的"isSynthetic"属性,但实际上这几乎被实现忽略,而不是用于动态代理或匿名类.合成字段和构造函数用于实现嵌套类(字节代码中没有嵌套类的概念,仅在源代码中).
我认为合成类的概念已被证明是无用的,即没有人关心一个类是否是合成的.使用字段和方法,它可能只在一个地方使用:确定在IDE类结构视图中显示的内容 - 您希望显示常规方法和字段,而不是用于模拟嵌套类的合成方法和字段.OTOH,你想要匿名课程出现在那里.
它们是由JVM在运行时创建的,它们调用内部类的私有成员以进行调试
JVM在运行时为执行目的而创建的方法,字段和类称为Synthetic
http://www.javaworld.com/article/2073578/java-s-synthetic-methods.html
http://javapapers.com/core-java/java-synthetic-class-method-field/