Синтетический класс в Java

Что такое синтетический класс в Java? Почему он должен использоваться? Как я могу использовать его?

Ответ 1

Например, если у вас есть оператор switch, java создает переменную, начинающуюся с $. Если вы хотите увидеть пример этого, загляните в java-отражение класса, в котором есть оператор switch. Вы увидите эти переменные, если у вас есть хотя бы один оператор switch в любом месте класса.

Чтобы ответить на ваш вопрос, я не считаю, что вы можете получить доступ (помимо отражения) синтетических классов.

Если вы анализируете класс, о котором вы ничего не знаете (посредством рефлексии), и вам нужно знать очень конкретные и низкоуровневые вещи об этом классе, вы можете использовать методы отражения Java, которые связаны с синтетическим классы. Единственное "использование" здесь - получить дополнительную информацию о классе, чтобы правильно использовать его в вашем коде.

(Если вы делаете это, вы, вероятно, создаете фреймворк, который могут использовать другие разработчики.)

В противном случае, если вы не используете отражение, практических применений синтетических классов я не знаю.

Ответ 2

Java имеет возможность создавать классы во время выполнения. Эти классы известны как синтетические классы или динамические прокси.

Подробнее см. http://java.sun.com/j2se/1.5.0/docs/guide/reflection/proxy.html.

Другие библиотеки с открытым исходным кодом, такие как CGLIB и ASM также позволяет создавать синтетические классы и более мощные, чем библиотеки, предоставляемые JRE.

Синтетические классы используются библиотеками AOP (Aspect Oriented Programming), такими как Spring AOP и AspectJ, а также библиотеки ORM, такие как Hibernate.

Ответ 3

Ну, я нашел ответ на первый вопрос в google:

Класс может быть помечен как синтетический, если он генерируется компилятором, что есть, он не появляется в источнике код.

Это просто базовое определение, но я нашел его в теме форума, и объяснений не было. Все еще ищу лучшего...

Ответ 4

синтетические классы/методы/поля:

Эти вещи важны для виртуальной машины. Посмотрите следующий фрагмент кода:

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

Ответ 5

В соответствии с это обсуждение, хотя спецификация языка описывает "isSynthetic" для классов, это в значительной степени игнорируется реализациями и не используется для динамических прокси или анонимных классов. Синтетические поля и конструкторы используются для реализации вложенных классов (нет понятия вложенных классов в байтовый код, только в исходном коде).

Я думаю, что концепция синтетических классов просто оказалась нецелесообразной, т.е. никто не заботится о том, является ли класс синтетическим. С полями и методами он, вероятно, используется в одном месте: определить, что нужно показать в представлении структуры класса IDE - вы хотите, чтобы там отображались обычные методы и поля, но не синтетические, используемые для имитации вложенных классов. OTOH, вы хотите, чтобы там появились анонимные классы.

Ответ 6

Они создаются JVM во время выполнения, когда они вызывают частные члены внутреннего класса для целей отладки

Методы, поля, класс, созданные JVM во время выполнения для его выполнения, называются Synthetic

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

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

Ответ 7

Кроме того, EasyMock использует синтетические классы или динамические прокси для создания реализаций интерфейсов или абстрактных классов во время выполнения.

http://www.easymock.org/

Ответ 8

Если я получу это правильно, синтетический класс будет генерироваться "на лету", не указывая на это явное имя. Например:

//...
Thread myThread = new Thread() {
         public void run() {
           // do something ...
         }
       };
myThread.start();
//...

Создает синтетический подкласс Thread и переопределяет его метод run(), затем создает его и запускает.

Ответ 9

Когда компилятор Java компилирует определенные конструкции, такие как внутренние классы, он создает синтетические конструкции; это классы, методы, поля и другие конструкции, которые не имеют соответствующей конструкции в исходном коде.
Применение: Синтетические конструкции позволяют компиляторам Java внедрять новые функции языка Java без изменений в JVM. Однако синтетические конструкции могут различаться в разных реализациях компилятора Java, а это значит, что файлы .class могут различаться и между различными реализациями.
ссылка: docs.oracle.com

Ответ 10

Синтетические конструкции - это классы, методы, поля и т.д., которые не имеют соответствующей конструкции в исходном коде. Синтетические конструкции позволяют компиляторам Java внедрять новые функции языка Java без изменений в JVM. Однако синтетические конструкции могут различаться между различными реализациями компилятора Java, а это значит, что .class файлы также могут различаться между различными реализациями.

Ответ 11

Я видел синтетический класс в дизассемблированном проекте java 5+. Оказывается, это был взлом компилятора для включения включения перечислений.

Ответ 12

Синтетический класс не отображается в вашем коде, а составлен компилятором. Например. Метод Bridge, составленный компилятором в java, обычно является синтетическим.

public class Pair<T> {
    private T first;
    private T second;
    public void setSecond(T newValue) {
        second = newValue;
    }// Of seSecond
}// Of class Pair<T>


public class DateInterval extends Pair<String> {
    public void setSecond(String second) {
        System.out.println("OK sub");
    }

    public static void main(String[] args) throws NoSuchFieldException,    SecurityException {

        DateInterval interval = new DateInterval();
        Pair pair = interval;
        pair.setSecond("string1");
    }
}

Используя инструкцию javap -verbose DateInterval, вы можете увидеть мостовой метод

public void setSecond(java.lang.Object);
flags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC

он составлен компилятором, однако не отображается в вашем коде.