ludovicmailleta | Mon, 09 Jul 2007 13:22:00 GMT |
Many APIs require a fair amount of boilerplate code. For example, in order to write a JAX-RPC web service, you must provide a paired interface and implementation. This boilerplate could be generated automatically by a tool if the program were 揹ecorated?with annotations indicating which methods were remotely accessible.
Other APIs require 搒ide files?to be maintained in parallel with programs. For example JavaBeans requires a BeanInfo class to be maintained in parallel with a bean, and Enterprise JavaBeans (EJB) requires a deployment descriptor. It would be more convenient and less error-prone if the information in these side files were maintained as annotations in the program itself.
The Java platform has always had various ad hoc annotation mechanisms. For example the transient modifier is an ad hoc annotation indicating that a field should be ignored by the serialization subsystem, and the ...deprecated javadoc tag is an ad hoc annotation indicating that the method should no longer be used. As of release 5.0, the platform has a general purpose annotation (also known as metadata) facility that permits you to define and use your own annotation types. The facility consists of a syntax for declaring annotation types, a syntax for annotating declarations, APIs for reading annotations, a class file representation for annotations, and an annotation processing tool.
Annotations do not directly affect program semantics, but they do affect the way programs are treated by tools and libraries, which can in turn affect the semantics of the running program. Annotations can be read from source files, class files, or reflectively at run time.
Annotations complement javadoc tags. In general, if the markup is intended to affect or produce documentation, it should probably be a javadoc tag; otherwise, it should be an annotation.
Typical application programmers will never have to define an annotation type, but it is not hard to do so. Annotation type declarations are similar to normal interface declarations. An at-sign (...) precedes the interface keyword. Each method declaration defines an element of the annotation type. Method declarations must not have any parameters or a throws clause. Return types are restricted to primitives, String, Class, enums, annotations, and arrays of the preceding types. Methods can have default values. Here is an example annotation type declaration:
/**
* Describes the Request-For-Enhancement(RFE) that led
* to the presence of the annotated API element.
*/
public ...interface RequestForEnhancement {
intid();
String synopsis();
String engineer() default "[unassigned]";
String date();default "[unimplemented]";
}
Once an annotation type is defined, you can use it to annotate declarations. An annotation is a special kind of modifier, and can be used anywhere that other modifiers (such as public, static, or final) can be used. By convention, annotations precede other modifiers. Annotations consist of an at-sign (...) followed by an annotation type and a parenthesized list of element-value pairs. The values must be compile-time constants. Here is a method declaration with an annotation corresponding to the annotation type declared above:
...RequestForEnhancement(
id= 2868724,
synopsis = "Enable time-travel",
engineer = "Mr. Peabody",
date= "4/1/3007"
)
public static void travelThroughTime(Date destination) { ... }
An annotation type with no elements is termed a marker annotation type, for example:
/**
* Indicates that the specification of the annotated API element
* is preliminary and subject to change.
*/
public ...interface Preliminary { }
It is permissible to omit the parentheses in marker annotations, as shown below:
...Preliminary public class TimeTravel { ... }
In annotations with a single element, the element should be named value, as shown below:
/**
* Associates a copyright notice with the annotated API element.
*/
public ...interface Copyright {
String value();
}
It is permissible to omit the element name and equals sign (=) in a single-element annotation whose element name is value, as shown below:
...Copyright("2002 Yoyodyne Propulsion Systems")
public class OscillationOverthruster { ... }
To tie it all together, we'll build a simple annotation-based test framework. First we need a marker annotation type to indicate that a method is a test method, and should be run by the testing tool:
import java.lang.annotation.*;
/**
* Indicates that the annotated method is a test method.
* This annotation should be used only on parameterless static methods.
*/
...Retention(RetentionPolicy.RUNTIME)
...Target(ElementType.METHOD)
public ...interface Test { }
Note that the annotation type declaration is itself annotated. Such annotations are called meta-annotations. The first (...Retention(RetentionPolicy.RUNTIME)) indicates that annotations with this type are to be retained by the VM so they can be read reflectively at run-time. The second (...Target(ElementType.METHOD)) indicates that this annotation type can be used to annotate only method declarations.
Here is a sample program, some of whose methods are annotated with the above interface:
public class Foo {
...Test public static void m1() { }
public static void m2() { }
...Test public static void m3() {
throw new RuntimeException("Boom");
}
public static void m4() { }
...Test public static void m5() { }
public static void m6() { }
...Test public static void m7() {
throw new RuntimeException("Crash");
}
public static void m8() { }
}
Here is the testing tool:
import java.lang.reflect.*;
public class RunTests {
public static void main(String[] args) throws Exception {
int passed = 0, failed = 0;
for (Method m : Class.forName(args[0]).getMethods()) {
if (m.isAnnotationPresent(Test.class)) {
try {
m.invoke(null);
passed++;
} catch (Throwable ex) {
System.out.printf("Test %s failed: %s %n", m, ex.getCause());
failed++;
}
}
}
System.out.printf("Passed: %d, Failed %d%n", passed, failed);
}
}
The tool takes a class name as a command line argument and iterates over all the methods of the named class attempting to invoke each method that is annotated with the Test annotation type (defined above). The reflective query to find out if a method has a Test annotation is highlighted in green. If a test method invocation throws an exception, the test is deemed to have failed, and a failure report is printed. Finally, a summary is printed showing the number of tests that passed and failed. Here is how it looks when you run the testing tool on the Foo program (above):
$ java RunTests Foo
Test public static void Foo.m3() failed: java.lang.RuntimeException: Boom
Test public static void Foo.m7() failed: java.lang.RuntimeException: Crash
Passed: 2, Failed 2
While this testing tool is clearly a toy, it demonstrates the power of annotations and could easily be extended to overcome its limitations.
http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html
yawmarka | Mon, 09 Jul 2007 13:22:00 GMT |
kajbja | Mon, 09 Jul 2007 13:22:00 GMT |
yawmarka | Mon, 09 Jul 2007 13:22:00 GMT |
kajbja | Mon, 09 Jul 2007 13:22:00 GMT |
yawmarka | Mon, 09 Jul 2007 13:22:00 GMT |
ludovicmailleta | Mon, 09 Jul 2007 13:22:00 GMT |
> > And you did it less than 6 minutes. :)
>
> I've been practicing with "Mavis Beacon Teaches
> Typing 5". I've gotten pretty speedy.
I'm a fast typer:
qwerty adl鰂jasdfkjl asdf asp09 35 qwergtkmn asert89qw3 asd ad fn
I wrote that in less than 2 seconds :)
/Kaj
kajbja | Mon, 09 Jul 2007 13:22:00 GMT |
Sorry, one more serious question to test your speed :o)
I saw that a RetentionPolicy.SOURCE retention type is discarded by the compiler...
Do you know if this is possible to annotate some code with different RetentionPolicy.SOURCE retention type, or other mechanism, to avoid discarding of only a sub set of code ?
For example, it could be used to discard some 'logger.log()' that are not loggable at a current level ?
Ludovic
ludovicmailleta | Mon, 09 Jul 2007 13:22:00 GMT |
Hi wonder how to put a z-value on a imageicon or jlabel? (which to be on top, and second..etc)Thanks in advance!...
I need to select a rectangular region of a graph with mouse dragging and then zoom that region. Can anyone tell me how to proceed? Thanks in advance......
Hi was just just wondering how One may zoom into and image on a jpanel.I have managed to do it vertically but not horizontally so it only zooms into one part. Your selp will be very much appreciated...
Hi guys,In my Applet , I'm drawing some shapes (ovals and lines) .I need to add zooming functionality , so that when i click zoom in button the Image is scaled correspondly.can someone suggest a way to do that ?thanks....
Hi i am making a photo editing program where all the canvases extend Jpanel and are stored in JInternalFrames.what i am trying to do is to make a decent zoom in/out function where everything is properly in proportion without losing any image quality when you zoom back to 100%.when it is zoomed ...
When I run any java 3D program It gives exception"Exception in main c:\jdk path\jre\bin\d3D.dll" "Can't find dependent liabraries"I have set correct classpath of java 3D liabrariesCan any one tell me how to resolve this exception ?...
When I compile java 3D program it compile successfullyBut at run time it gives Exception Can't find dependent librariesUnsatisfiedLinkError "c:\jdk path\jre\bin\J3D.dll"I have set correct classpath then also this problem is occued .Can anybody help me ?...
Is Java 1.5 considered offially released (no longer beta)?If so, and I install it on my machine, could it break any 1.4.2 apps?If so, is there a way to install 1.5 and keep my installation on 1.4.2? If I do that, how do I specify which one I want to run? That is, make the commandjava ...
The default look and feel of swing is quite more beautiful in tiger. anyway who has a ready made calculation that can always make a dialog box appear at the exact center of the JFrame.Also how can i make JInternalFrames arrange side by side on a JDesktop pane as its being added to itthanx ...
Hi installed java 1.5 and get all the windows xp memory resources when try to open some dialogs in netbeans 4.0 and dbvisualizer...i had to uninstall it to keep workingany idea?TyBruno...
Dera friends,my homework have some problem. how I can print out the input String of "newrecipe & intandqua" after all the data already input?many thanks!{System.out.print("Need to insert a new recipe? ( y or n ) ");Select=Keyboard.readString();if (select.equals("y")){System.out.print("How ...
Hello,I'm trying to use a JAR file in a Java project I'm writing using Netbeans. I added the file in the Library Manager and added an appropriate import line to the source code, but it doesn't work. How can I solve the problem?...
Does anyone know how to place an image in an application using JApplet? Please hep if you do know i need a picture to show up in an application and not an applet...
Hi,I am using Jakarta HTTPClient - http://jakarta.apache.org/commons/httpclient/ Does anyone know how do I disable HTTPClient to log to my own log file?Thank you very much,Any help will be appreciated....
Does anyone know how I am supposed to read in a TIFF image using JAI? I tried the sample code from here: http://java.sun.com/products/java-media/jai/forDevelopers/jai1_0_1guide-unc/Acquisition.doc.html#74172but it doesn't seem to work. Does anyone know how to get it to work? Or should I just ...