ejemplo - ¿Cuáles son las similitudes y diferencias entre las anotaciones de Java y los atributos de C#?
notacion en java (4)
El control sobre cuándo se hacen accesibles sus metadatos es diferente entre los dos idiomas.
Java proporciona la anotación java.lang.annotation.Retention y java.lang.annotation.RetentionPolicy enum para controlar cuándo se puede acceder a los metadatos de la anotación. Las opciones varían desde Runtime
(más común - metadatos de anotación retenidos en archivos de clase), hasta Source
(metadatos descartados por el compilador). Usted etiqueta su interfaz de anotación personalizada con esto, por ejemplo:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.CLASS)
public @interface TraceLogging {
// etc
}
le permitiría reflejar en su anotación TraceLogging
personalizada en tiempo de ejecución.
C # usa el atributo ConditionalAttribute que se maneja desde símbolos de tiempo de compilación. Entonces el ejemplo análogo en C # es:
[Conditional("TRACE")]
public class TraceLoggingAttribute : Attribute
{
// etc
}
lo que provocaría que el compilador escupiera los metadatos de su atributo personalizado TraceLogging
solo si se definía el símbolo TRACE
.
NÓTESE BIEN. los metadatos de atributo están disponibles en tiempo de ejecución de forma predeterminada en C #; esto solo es necesario si desea cambiar eso.
Tengo una biblioteca Java que estoy considerando transferir a C #. La biblioteca Java hace un uso extenso de las anotaciones (tanto en el tiempo de compilación como en el tiempo de ejecución).
Nunca he usado atributos de C #, pero entiendo que son el equivalente aproximado de las anotaciones de Java.
Si procedo con el puerto utilizando atributos para reemplazar las anotaciones, ¿qué debo saber? ¿Qué va a ser lo mismo? ¿Diferente? ¿Qué me va a morder?
Siguiendo con lo que dijo Jon ...
Tanto Java 5 como Java 6 permiten la metaprogramación. Java 5 usa una herramienta apt por separado; Java 6 lo integra en el compilador. (Aunque el Java 5 apt todavía está disponible en Java 6)
Desafortunadamente, cada uno usa una API diferente.
Actualmente estoy usando la API de Java 5 para mis anotaciones de Bean
Consulte http://code.google.com/p/javadude/wiki/Annotations para obtener un ejemplo (NOTA: actualmente estoy realizando algunas actualizaciones importantes, algunas de las cuales cambian la API).
Cosas muy interesantes ... - Scott
Un aspecto importante de las anotaciones de Java que aún no he analizado en detalle: puede escribir código que utiliza anotaciones dentro de javac (a partir de Java 6, creo) como una forma de metaprogramación .
PostSharp permite algo similar, ciertamente.
(Eso está lejos de ser la única diferencia, pero es todo por lo que tengo tiempo ahora).
Una diferencia interesante es que C # permite atributos de módulo y nivel de ensamblaje. Estos se aplican a su módulo o conjunto y están disponibles a través de la reflexión de la manera normal. Java no proporciona una reflexión en un archivo jar, por lo que las anotaciones de nivel de jar no son posibles.
De hecho, esto es bastante común como Visual Studio, un archivo llamado AssemblyInfo.cs
en el nivel de proyecto raíz que contiene, por ejemplo:
[assembly: AssemblyVersionAttribute("1.2.3.4")]
[assembly: AssemblyTitleAttribute("My project name blah blah")]
...
No hay una anotación de nivel de jar equivalente en Java (aunque desde jdk5, hay un pequeño mecanismo de anotación de nivel de paquete usado, gracias a mmeyers para señalarlo)