And*_*ate 106
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)使用.
and*_*app 54
好吧,我找到了谷歌第一个问题的答案:
如果类由编译器生成,则可以将其标记为合成类,也就是说,它不会出现在源代码中.
这只是一个基本的定义,但我发现它在一个论坛帖子中,并没有解释.还在寻找更好的......
Mil*_*ous 15
例如,当你有一个switch语句时,java会创建一个以$开头的变量.如果你想看一个这样的例子,请查看其中包含switch语句的类的java反射.当您在类中的任何位置至少有一个switch语句时,您将看到这些变量.
为了回答你的问题,我不相信你能够访问合成类(除了反射).
如果您正在分析一个您不了解的类(通过反射)并且需要知道关于该类的非常具体和低级的事情,您最终可能会使用与合成类有关的Java反射方法.这里唯一的"使用"是获取有关该类的更多信息,以便在您的代码中正确使用它.
(如果你这样做,你可能正在构建一些其他开发人员可以使用的框架.)
否则,如果你没有使用反射,我所知道的合成类没有实际用途.
小智 14
合成类/方法/领域:
这些对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() {
}
}
}
Run Code Online (Sandbox Code Playgroud)
它们是由JVM在运行时创建的,它们调用内部类的私有成员以进行调试
JVM在运行时为执行目的而创建的方法,字段和类称为Synthetic
http://www.javaworld.com/article/2073578/java-s-synthetic-methods.html
http://javapapers.com/core-java/java-synthetic-class-method-field/