Klasa syntetyczna w Javie

Czym jest klasa syntetyczna w Javie? Dlaczego warto go stosować? Jak mogę z niego korzystać?

Author: Michael, 2008-12-30

12 answers

Na przykład, gdy masz polecenie switch, java tworzy zmienną zaczynającą się od $. Jeśli chcesz zobaczyć przykład tego, zajrzyj do odzwierciedlenia Javy klasy, która ma w sobie instrukcję switch. Zobaczysz te zmienne, gdy masz przynajmniej jedną instrukcję switch w dowolnym miejscu w klasie.

Odpowiadając na twoje pytanie, nie wierzę, że jesteś w stanie uzyskać dostęp(poza refleksją) do klas syntetycznych.

Jeśli analizujesz klasę, której nie znasz cokolwiek o (poprzez odbicie) i musisz wiedzieć bardzo konkretne i niskopoziomowe rzeczy o tej klasie, możesz skończyć używając Java reflection metod, które mają związek z klasami syntetycznymi. Jedyne "użycie" tutaj to uzyskanie więcej informacji o klasie, aby odpowiednio ją wykorzystać w kodzie.

(jeśli to robisz, prawdopodobnie budujesz framework, którego inni programiści mogliby użyć. )

W przeciwnym razie, jeśli nie używasz odbicia, nie ma praktycznych zastosowań syntetycznych klas, o których wiem.

 13
Author: Milhous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-21 14:43:11

Java ma możliwość tworzenia klas w czasie wykonywania. Klasy te są znane jako klasy syntetyczne lub dynamiczne Proxy.

Zobacz http://java.sun.com/j2se/1.5.0/docs/guide/reflection/proxy.html Aby uzyskać więcej informacji.

Inne biblioteki open-source, takie jak CGLIB i ASM również pozwalają na generowanie klas syntetycznych i są bardziej wydajne niż biblioteki dostarczane z JRE.

Klasy syntetyczne są używane przez AOP (Aspect Oriented Programowanie) bibliotek takich jak Spring AOP i AspectJ, a także bibliotek ORM takich jak Hibernate.

 102
Author: Andrew Newdigate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-08 12:04:47

Cóż znalazłem odpowiedź na pierwsze pytanie w google:

Klasa może być oznaczona jako syntetyczna, jeśli jest generowany przez kompilator, który jest, nie występuje w źródle kod.

To tylko podstawowa definicja, ale znalazłem ją w wątku na forum i nie było wyjaśnienia. Wciąż szukam lepszego...

 53
Author: andHapp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-30 04:49:10

Klasy / metody / pola syntetyczne:

Te rzeczy są ważne dla maszyny wirtualnej. Spójrz na poniższy fragment kodu:

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() {
    }
  }
}
 13
Author: Vinay Wadhwa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-25 08:58:21

Zgodnie z ta dyskusja, chociaż specyfikacja języka opisuje "issyntetyczną" proprty dla klas, jest to prawie ignorowane przez implementacje i nie jest używane ani dla dynamicznych proxy, ani dla anonimowych klas. Syntetyczne pola i konstruktory są używane do implementacji klas zagnieżdżonych (nie ma pojęcia klas zagnieżdżonych w kodzie bajtowym, tylko w kodzie źródłowym).

Myślę, że pojęcie klas syntetycznych okazało się po prostu bezużyteczne, tzn. nikogo to nie obchodzi czy klasa jest syntetyczna. W przypadku pól i metod, prawdopodobnie jest on używany dokładnie w jednym miejscu: aby określić, co ma być pokazane w widoku struktury klas IDE - chcesz, aby pokazywały się tam normalne metody i pola, ale nie te syntetyczne Używane do symulacji klas zagnieżdżonych. OTOH, chcesz, żeby anonimowe zajęcia się tam pojawiły.

 8
Author: Michael Borgwardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-30 13:22:31

Są one tworzone przez JVM w czasie wykonywania, gdy wywołują prywatnych członków wewnętrznej klasy w celu debugowania

Metody, pola, klasy utworzone przez JVM w czasie wykonywania w celu jego wykonania nazywane są syntetycznymi

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

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

 7
Author: sathis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-24 17:10:28

Również klasy syntetyczne lub dynamiczne proxy są używane przez EasyMock do tworzenia implementacji interfejsów lub klas abstrakcyjnych w czasie wykonywania.

Http://www.easymock.org/

 3
Author: user2427,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-30 13:04:57

Jeśli dobrze zrozumiałem, Klasa syntetyczna jest klasą generowaną w locie, bez konieczności podawania jej wyraźnej nazwy. Na przykład:

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

Tworzy syntetyczną podklasę wątku i nadpisuje jej metodę run (), a następnie tworzy jej instancję i uruchamia.

 2
Author: Ivan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-23 10:50:00

Gdy kompilator Javy kompiluje pewne konstrukcje, takie jak Klasy wewnętrzne, tworzy konstrukcje syntetyczne; są to Klasy, metody, pola i inne konstrukcje, które nie mają odpowiedniego konstruktu w kodzie źródłowym.
zastosowania: Konstrukty syntetyczne umożliwiają kompilatorom Javy implementację nowych funkcji języka Java bez zmian w JVM. Jednak konstrukty syntetyczne mogą się różnić w zależności od implementacji kompilatora Javy, co oznacza, że .Klasa pliki mogą się różnić w zależności od implementacji.
reference: docs.oracle.com

 2
Author: anavaras lamurep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-17 19:35:27

Konstrukty syntetyczne to Klasy, metody, pola itp., które nie mają odpowiedniego konstruktu w kodzie źródłowym. Konstrukty syntetyczne umożliwiają kompilatorom Javy implementację nowych funkcji języka Java bez zmian w JVM. Jednak konstrukty syntetyczne mogą się różnić w zależności od implementacji kompilatora Javy, co oznacza, że .pliki klas mogą się również różnić w zależności od implementacji.

 1
Author: Srivats krishnan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-02 16:16:54

Widziałem klasę syntetyczną w zdemontowanym projekcie java 5+. Okazało się, że był to hack kompilatora do zaimplementowania włączania enum.

 0
Author: thejoshwolfe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-27 08:50:00

Klasa syntetyczna nie pojawia się w Twoim kodzie: jest tworzona przez kompilator. Np. metoda bridge tworzona przez kompilator w Javie jest zazwyczaj syntetyczna.

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");
    }
}

Używając polecenia javap -verbose DateInterval, możesz zobaczyć metodę bridge:

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

Został stworzony przez kompilator; nie pojawia się w Twoim kodzie.

 0
Author: JavaFresher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-31 10:18:21