settitle - poner borde a un jlabel en java
Clase sintética en Java (12)
Bueno, encontré la respuesta a la primera pregunta en google:
Una clase puede marcarse como sintética si es generada por el compilador, es decir, no aparece en el código fuente.
Esta es solo una definición básica, pero la encontré en un hilo del foro y no hubo explicación. Todavía estoy buscando uno mejor ...
¿Qué es una clase sintética en Java? ¿Por qué debería ser usado? ¿Como puedo usar lo?
Cuando el compilador de Java compila ciertas construcciones, como las clases internas, crea construcciones sintéticas ; estas son clases, métodos, campos y otras construcciones que no tienen una construcción correspondiente en el código fuente.
Usos: Las construcciones sintéticas permiten a los compiladores de Java implementar nuevas características de lenguaje Java sin cambios en la JVM. Sin embargo, las construcciones sintéticas pueden variar entre las diferentes implementaciones del compilador de Java, lo que significa que los archivos .class también pueden variar entre diferentes implementaciones.
referencia: docs.oracle.com
De acuerdo con esta discusión , aunque la especificación del lenguaje describe una propiedad "isSynthetic" para las clases, las implementaciones prácticamente lo ignoran y no se usan para proxies dinámicos ni para clases anónimas. Los campos sintéticos y los constructores se utilizan para implementar clases anidadas (no existe el concepto de clases anidadas en el código de bytes, solo en el código fuente).
Creo que el concepto de clases sintéticas simplemente ha demostrado no ser útil, es decir, a nadie le importa si una clase es sintética. Con campos y métodos, probablemente se use en exactamente un lugar: para determinar qué mostrar en una vista de estructura de clase IDE, quiere que aparezcan los métodos y campos normales, pero no los sintéticos utilizados para simular clases anidadas. OTOH, QUIERES que aparezcan clases anónimas allí.
Java tiene la capacidad de crear clases en tiempo de ejecución. Estas clases se conocen como clases sintéticas o proxies dinámicas.
Consulte http://java.sun.com/j2se/1.5.0/docs/guide/reflection/proxy.html para obtener más información.
Otras bibliotecas de código abierto, como CGLIB y ASM también le permiten generar clases sintéticas, y son más potentes que las bibliotecas proporcionadas con el JRE.
Las clases sintéticas son utilizadas por las bibliotecas AOP (Programación Orientada a Aspectos) como Spring AOP y AspectJ, así como por bibliotecas ORM como Hibernate.
La clase sintética no aparece en tu código, pero está compuesta por el compilador. Por ejemplo, el método Bridge compuesto por el compilador en Java es típicamente sintético.
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");
}
}
Usando javap -verbose DateInterval
instruction, puedes ver un método puente
public void setSecond(java.lang.Object);
flags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC
está compuesto por un compilador, sin embargo, no aparece en tu código.
Las construcciones sintéticas son clases, métodos, campos, etc. que no tienen una construcción correspondiente en el código fuente. Las construcciones sintéticas permiten a los compiladores de Java implementar nuevas características de lenguaje Java sin cambios en la JVM. Sin embargo, las construcciones sintéticas pueden variar entre las diferentes implementaciones del compilador de Java, lo que significa que los archivos .class también pueden variar entre diferentes implementaciones.
Por ejemplo, cuando tienes una instrucción switch, java crea una variable que comienza con $. Si desea ver un ejemplo de esto, eche un vistazo al reflejo de java de una clase que tiene una declaración de cambio en él. Verá estas variables cuando tenga al menos una instrucción switch en cualquier parte de la clase.
Para responder a su pregunta, no creo que pueda acceder (aparte de la reflexión) a las clases sintéticas.
Si estás analizando una clase de la que no sabes nada (a través de la reflexión) y necesitas saber cosas muy específicas y de bajo nivel sobre esa clase, puedes terminar usando métodos de reflexión de Java que tienen que ver con clases sintéticas. El único "uso" aquí es obtener más información sobre la clase para usarla apropiadamente en su código.
(Si está haciendo esto, probablemente esté creando un marco de algún tipo que otros desarrolladores podrían usar).
De lo contrario, si no está utilizando la reflexión, no hay usos prácticos de clases sintéticas que yo sepa.
Si lo hago bien, una clase sintética es una generada sobre la marcha, sin tener que darle un nombre explícito. Por ejemplo:
//...
Thread myThread = new Thread() {
public void run() {
// do something ...
}
};
myThread.start();
//...
Esto crea una subclase sintética de Subproceso y anula su método run (), luego lo instancia y lo inicia.
Son creados por JVM en tiempo de ejecución cuando invocan miembros privados de clase interna para fines de depuración
Los métodos, campos y clases creados por JVM durante el tiempo de ejecución para su ejecución se denominan sintéticos.
http://www.javaworld.com/article/2073578/java-s-synthetic-methods.html
http://javapapers.com/core-java/java-synthetic-class-method-field/
También EasyMock utiliza clases sintéticas o proxies dinámicas para crear implementaciones de interfaces o clases abstractas en tiempo de ejecución.
Vi una clase sintética en un proyecto desmontado de Java 5+. Resulta que fue un truco de compilador para implementar encender enums.
clases / métodos / campos sintéticos:
Estas cosas son importantes para la VM. Eche un vistazo al siguiente fragmento de código:
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() {
}
}
}