Klasa syntetyczna w Javie
Czym jest klasa syntetyczna w Javie? Dlaczego warto go stosować? Jak mogę z niego korzystać?
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.
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.
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...
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() {
}
}
}
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.
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/
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.
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.
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
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.
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.
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.
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