当前位置:  开发笔记 > 编程语言 > 正文

Java中的合成类

如何解决《Java中的合成类》经验,为你挑选了6个好方法。

什么是Java中的合成类?为什么要使用它?我怎么用呢?



1> Andrew Newdi..:

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)使用.


动态代理不是Synthetic Classes.Proof:`Proxy.newProxyInstance(Runnable.class.getClassLoader(),new Class [] {Runnable.class},(proxy,method,args1) - > null).getClass().isSynthetic( )== false`
`java.lang.reflect.Member#isSynthetic`的javadoc说:_Returns如果编译器引入了这个成员,则为true; 否则返回false ._

2> andHapp..:

好吧,我找到了谷歌第一个问题的答案:

如果类由编译器生成,则可以将其标记为合成类,也就是说,它不会出现在源代码中.

这只是一个基本的定义,但我发现它在一个论坛帖子中,并没有解释.还在寻找更好的......



3> Milhous..:

例如,当你有一个switch语句时,java会创建一个以$开头的变量.如果你想看一个这样的例子,请查看其中包含switch语句的类的java反射.当您在类中的任何位置至少有一个switch语句时,您将看到这些变量.

为了回答你的问题,我不相信你能够访问合成类(除了反射).

如果您正在分析一个您不了解的类(通过反射)并且需要知道关于该类的非常具体和低级的事情,您最终可能会使用与合成类有关的Java反射方法.这里唯一的"使用"是获取有关该类的更多信息,以便在您的代码中正确使用它.

(如果你这样做,你可能正在构建一些其他开发人员可以使用的框架.)

否则,如果你没有使用反射,我所知道的合成类没有实际用途.


这不回答这个问题.
有趣.你有一些示例代码吗?

4> 小智..:

合成类/方法/领域:

这些对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() {
    }
  }
}


此示例是否生成合成*类*?
@CiroSantilli乌坎事件2016六四事件法轮功,不,只有合成存取方法.

5> Michael Borg..:

根据这个讨论,虽然语言规范描述了类的"isSynthetic"属性,但实际上这几乎被实现忽略,而不是用于动态代理或匿名类.合成字段和构造函数用于实现嵌套类(字节代码中没有嵌套类的概念,仅在源代码中).

我认为合成类的概念已被证明是无用的,即没有人关心一个类是否是合成的.使用字段和方法,它可能只在一个地方使用:确定在IDE类结构视图中显示的内容 - 您希望显示常规方法和字段,而不是用于模拟嵌套类的合成方法和字段.OTOH,你想要匿名课程出现在那里.



6> sathis..:

它们是由JVM在运行时创建的,它们调用内部类的私有成员以进行调试

JVM在运行时为执行目的而创建的方法,字段和类称为Synthetic

http://www.javaworld.com/article/2073578/java-s-synthetic-methods.html

http://javapapers.com/core-java/java-synthetic-class-method-field/

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有