Domanda

Cos'è una classe sintetica in Java?Perché dovrebbe essere utilizzato?Come posso usarlo?

È stato utile?

Soluzione

Ad esempio, quando si dispone di un'istruzione switch, Java crea una variabile che inizia con un $. Se volete vedere un esempio di questo, sbirciare nella riflessione java di una classe che ha un'istruzione switch in esso. Vedrete queste variabili quando si dispone di almeno un'istruzione switch in qualsiasi punto della classe.

Per rispondere alla tua domanda, io non credo che tu sia in grado di accesso (diverso riflessione) le classi di sintesi.

Se si sta analizzando una classe che non si sa nulla (attraverso la riflessione) e la necessità di conoscere le cose molto specifiche e di basso livello su quella classe, si può finire con metodi di riflessione Java che hanno a che fare con il sintetico classi. L'unico "uso" qui è ottenere ulteriori informazioni sulla classe al fine di utilizzare in modo appropriato nel codice.

(Se stai facendo questo, probabilmente stai costruendo un quadro di alcune specie che altri sviluppatori potrebbero usare.)

In caso contrario, se non si utilizza la riflessione, non ci sono utilizzi pratici delle classi di sintesi, che io sappia.

Altri suggerimenti

Java ha la capacità di creare classi in fase di esecuzione. Queste classi vengono dette classi sintetici o proxy dinamici.

http://java.sun.com /j2se/1.5.0/docs/guide/reflection/proxy.html per ulteriori informazioni.

Altre librerie open-source, come ad esempio CGLIB e ASM permettono anche di generare classi di sintesi, e sono più potenti delle librerie fornite con il JRE.

classi sintetici sono utilizzati da AOP (Aspect Oriented Programming) librerie come Spring AOP e AspectJ, così come le librerie ORM come Hibernate.

Bene ho trovato la risposta alla prima domanda su google:

  

Una classe può essere contrassegnato come se sintetica   è generato dal compilatore, che   si, non appare nella fonte   codice.

Questa è solo una definizione di base, ma l'ho trovato in un thread del forum e non c'era alcuna spiegazione. Ancora alla ricerca di uno migliore ...

classi sintetici / metodi / campi:

Queste cose sono importanti per la VM. Date un'occhiata al seguente frammento di codice:

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

questa discussione , anche se le specifiche del linguaggio descrive un proprty "isSynthetic" per le classi, questo è praticamente ignorato da implementazioni e non utilizzati sia per proxy dinamici o classi anonime. campi sintetici e costruttori vengono utilizzati per implementare le classi nidificate (non c'è il concetto di classi annidate in bytecode, solo nel codice sorgente).

Penso che il concetto di classi di sintesi ha semplicemente dimostrato di essere non utile, vale a dire a nessuno importa se una classe è sintetico. Con campi e metodi, probabilmente usato esattamente un unico luogo: per determinare cosa mostrare in un IDE vista struttura di classe - che si desidera metodi e campi normali di presentarsi lì, ma non quelli di sintesi utilizzato per simulare classi nidificate. OTOH, si DESIDERA classi anonime per mostrare lassù.

Vengono creati da JVM in fase di esecuzione quando richiamano membri privati ​​della classe interna a scopo di debug

I metodi, i campi e le classi creati da JVM durante il runtime per il suo scopo di esecuzione sono chiamati sintetici

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

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

Anche Classi sintetici o dinamico proxy sono utilizzati da EasyMock per creare implementazioni di interfacce o classi astratte in fase di esecuzione.

http://www.easymock.org/

Quando il compilatore Java compila alcuni costrutti, come ad esempio le classi interne, si crea costrutti sintetici ; questi sono classi, metodi, campi e altri costrutti che non dispongono di una corrispondente costrutto nel codice sorgente.
Utilizza: costrutti sintetici consentono compilatori Java per implementare nuove funzionalità del linguaggio Java senza modifiche alla JVM. Tuttavia, costrutti sintetici possono variare tra diverse implementazioni compilatore Java, il che significa che i file .class può variare tra le diverse implementazioni così
di riferimento:. docs.oracle.com

Per quanto varie risposte hanno già sottolineato, il compilatore è permesso di generare vari costrutti (tra cui le classi) che non corrispondono direttamente a qualcosa nel codice souce. Queste devono essere contrassegnati come sintetica:

13.1. La forma di un binario

  

Una rappresentazione binaria per una classe o interfaccia deve anche contenere tutti i seguenti:
  [...]
  11. Un costrutto emessa da un compilatore Java deve essere contrassegnato come sintetico se non corrisponde ad un costrutto dichiarata esplicitamente o implicitamente nel codice sorgente, a meno che il costrutto emesso è un metodo di inizializzazione classe (JVM §2.9).
  [...]

Come sottolineato da @Holger in un commento ad un'altra domanda, esempi rilevanti di tali costrutti sono gli oggetti classe che rappresenta metodo di riferimenti e lambda:

System.out.println(((Runnable) System.out::println).getClass().isSynthetic());
System.out.println(((Runnable) () -> {}).getClass().isSynthetic());

Output:

true
true

Anche se questo non è esplicitamente menzionato, dalla 15.27.4. Run-Time Valutazione delle Espressioni lambda :

  

Il valore di un'espressione lambda è un riferimento a un'istanza di una classe con le seguenti proprietà: [...]

e la formulazione quasi identica per il metodo di riferimento ( 15.13.3. run-time di valutazione del metodo di riferimenti ).

Dato che questa classe non è esplicitamente menzionato ovunque nel codice sorgente, deve essere sintetico.

Se ho capito bene, una classe sintetico è uno generato al volo, senza dover dare un nome esplicito. Ad esempio:

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

Questo crea una sottoclasse di sintesi di filo e sostituisce il suo metodo run (), quindi crea un'istanza di esso e lo avvia.

costrutti sintetici sono classi, metodi, campi ecc che non hanno un corrispondente costrutto nel codice sorgente. costrutti sintetici consentono compilatori Java per implementare nuove funzionalità del linguaggio Java senza modifiche alla JVM. Tuttavia, costrutti sintetici possono variare tra diverse implementazioni compilatore Java, il che significa che i file .class può variare tra diverse implementazioni pure.

Una classe sintetico non compare nel codice: è composto da compilatore. Per esempio. Procedimento ponte costituito da compilatore in Java è tipicamente sintetica.

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

Con il comando javap -verbose DateInterval, è possibile vedere un metodo bridge:

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

Questa era costituita da compilatore; non compare nel codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top