[java] 자바의 합성 클래스

Java의 합성 클래스는 무엇입니까? 왜 사용해야합니까? 어떻게 사용하나요?



답변

예를 들어, switch 문이 있으면 java는 $로 시작하는 변수를 만듭니다. 이에 대한 예제를 보려면 switch 문이 포함 된 클래스의 Java 리플렉션을 살펴보십시오. 클래스 어딘가에 적어도 하나의 switch 문이있을 때 이러한 변수가 표시됩니다.

귀하의 질문에 대답하기 위해 합성 클래스에 액세스 할 수 있다고 생각하지 않습니다.

리플렉션을 통해 알지 못하는 클래스를 분석하고 해당 클래스에 대해 매우 구체적이고 저수준 인 것을 알아야하는 경우 합성 클래스와 관련된 Java 리플렉션 방법을 사용할 수 있습니다. 여기서 유일한 “사용”은 코드에서 클래스를 적절하게 사용하기 위해 클래스에 대한 자세한 정보를 얻는 것입니다.

(이 작업을 수행하는 경우 다른 개발자가 사용할 수있는 일종의 프레임 워크를 구축하고있을 것입니다.)

그렇지 않으면 리플렉션을 사용하지 않는 경우 내가 아는 합성 클래스를 실제로 사용하지 않습니다.


답변

Java는 런타임에 클래스를 작성할 수 있습니다. 이러한 클래스를 합성 클래스 또는 동적 프록시라고합니다.

자세한 내용은 http://java.sun.com/j2se/1.5.0/docs/guide/reflection/proxy.html 을 참조하십시오.

CGLIBASM 과 같은 다른 오픈 소스 라이브러리 도 합성 클래스를 생성 할 수 있으며 JRE와 함께 제공된 라이브러리보다 강력합니다.

합성 클래스는 Spring AOP 및 AspectJ와 같은 AOP (Aspect Oriented Programming) 라이브러리와 Hibernate와 같은 ORM 라이브러리에서 사용됩니다.


답변

글쎄, 나는 구글의 첫 번째 질문에 대한 답을 찾았다.

클래스가 컴파일러에 의해 생성 된 경우, 즉 소스 코드에 나타나지 않으면 합성으로 표시 될 수 있습니다.

이것은 단지 기본 정의이지만 포럼 스레드에서 찾았으며 설명이 없습니다. 여전히 더 나은 것을 찾고 있습니다 …


답변

합성 수업 / 방법 / 분야 :

이러한 것들이 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/


답변

또한 EasyMock은 런타임에 인터페이스 또는 추상 클래스의 구현을 작성하기 위해 합성 클래스 또는 동적 프록시를 사용합니다.

http://www.easymock.org/