Что такое синтетический класс в 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 использует синтетические классы или динамические прокси для создания реализаций интерфейсов или абстрактных классов во время выполнения.
Ответ 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
он составлен компилятором, однако не отображается в вашем коде.