12 ответов:
например, когда у вас есть оператор switch, Java создает переменную, которая начинается с $. Если вы хотите увидеть пример этого, загляните в отражение java класса, в котором есть оператор switch. Вы увидите эти переменные, когда у вас есть хотя бы один оператор switch в любом месте класса.
чтобы ответить на ваш вопрос, я не верю, что вы можете получить доступ(кроме отражения) к синтетическим классам.
Если вы анализируете класс, который вы не знаю ничего о (через отражение) и нужно знать очень конкретные и низкоуровневые вещи об этом классе, вы можете в конечном итоге использовать методы отражения Java, которые имеют отношение к синтетическим классам. Единственное "использование" здесь-получить дополнительную информацию о классе, чтобы использовать его соответствующим образом в вашем коде.
(Если вы делаете это, вы, вероятно, создаете фреймворк некоторых видов, которые могут использовать другие разработчики. )
в противном случае, если вы не используете отражение, там нет никакого практического использования синтетических классов, о которых я знаю.
Java имеет возможность создавать классы во время выполнения. Эти классы известны как синтетические классы или динамические Прокси.
см.http://java.sun.com/j2se/1.5.0/docs/guide/reflection/proxy.html для получения дополнительной информации.
другие библиотеки с открытым исходным кодом, таких как CGLIB и ПКР также позволяют создавать синтетические классы, и являются более мощными, чем библиотеки, поставляемые с JRE.
синтетическая классы используется библиотеками AOP (Aspect Oriented Programming), такими как Spring AOP и AspectJ, а также библиотеками ORM, такими как Hibernate.
Ну, я нашел ответ на первый вопрос в Google:
класс может быть помечен как синтетического, если он генерируется компилятором, который есть, он не появляется в источнике код.
Это просто базовое определение, но я нашел его в теме форума, и не было никакого объяснения. Все еще ищу лучшего...
синтетические классы / методы / поля:
эти вещи важны для виртуальной машины. Посмотрите на следующий фрагмент кода:
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 " proprty для классов, это в значительной степени игнорируется реализациями и не используется ни для динамических прокси, ни для анонимных классов. Синтетические поля и конструкторы используются для реализации вложенных классов (в байтовом коде нет понятия вложенных классов, только в исходном коде).
Я думаю, что концепция синтетических классов просто оказалась не полезной, т. е. никого не волнует, является ли класс синтетических. С полями и методами он, вероятно, используется ровно в одном месте: чтобы определить, что показывать в представлении структуры классов IDE - вы хотите, чтобы там отображались обычные методы и поля, но не синтетические, используемые для имитации вложенных классов. Ото, вы же хотите, чтобы анонимные классы появились там.
Они создаются JVM во время выполнения, когда они вызывают закрытые члены внутреннего класса для отладки цели
методы, поля, класс, созданные JVM во время выполнения с целью его выполнения, называются синтетическими
http://www.javaworld.com/article/2073578/java-s-synthetic-methods.html
http://javapapers.com/core-java/java-synthetic-class-method-field/
также синтетические классы или динамические Прокси используются EasyMock для создания реализаций интерфейсов или абстрактных классов во время выполнения.
Если я правильно понял, синтетический класс генерируется на лету, без необходимости давать ему явное имя. Например:
//... Thread myThread = new Thread() { public void run() { // do something ... } }; myThread.start(); //...это создает синтетический подкласс потока и переопределяет его метод run (), затем создает его экземпляр и запускает его.
когда компилятор Java компилирует определенные конструкции, такие как внутренние классы, он создает синтетические конструкции; это классы, методы, поля и другие конструкции, которые не имеют соответствующей конструкции в исходном коде.
применение: Синтетические конструкции позволяют компиляторам Java реализовывать новые функции языка Java без изменений в JVM. Однако синтетические конструкции могут отличаться в разных реализациях компилятора Java, а это значит, что ... файлы классов также могут различаться в разных реализациях.
Ссылка:docs.oracle.com
синтетические конструкции-это классы, методы, поля и т. д., которые не имеют соответствующей конструкции в исходном коде. Синтетические конструкции позволяют компиляторам Java реализовывать новые функции языка Java без изменений в JVM. Однако синтетические конструкции могут различаться между различными реализациями компилятора Java, что означает это .файлы классов также могут различаться между различными реализациями.
Я видел синтетический класс в разобранном проекте java 5+. Оказывается, это был компилятор хак для реализации переключения на перечисления.
синтетический класс не отображается в коде: он составлен компилятором. Например, метод моста, составленный компилятором в java, обычно является синтетическим.
public class Pair<T> { private T first; private T second; public void setSecond(T newValue) { second = newValue; } } 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Это было составлено компилятором; он не появляется в вашем коде.
Comments