如今,Java™ 技术已无处不在:大型企业系统、台式机、手持设备,甚至智能卡都有它的身影。因此,Java 技术是全世界开发人员的首选平台。所有这些都发生 1995 年 Java 技术产生后的较短的时间内。尽管该技术在第一版发布后有过不少更新和改进,但通过并入一系列 Java Specification Request(JSR),核心 Java 平台 5.0 版带来的语言层面的更新和改进是前所未有的。在本次动手课程中,您将学习到所有这些更新以及如何使用 Java 5.0 平台构建桌面应用程序。本动手实验室将指导您使用 Java 注释。
预计时间:150 分钟
开始之前,需要在您的计算机中安装以下软件。
| public boolean equals(String otherName){ int comparisson = name.compareTo(otherName); return (comparisson == 0); } |
0. 如未启动 NetBeans IDE 则启动它。
1. 创建一个新 NetBeans 项目
| public class OverrideAnnotation { private String name; private int id; /** * Constructor **/ public OverrideAnnotation(){ name = "Java Passion!"; } public String getName(){ return name; } public void setName(String name){ this.name = name; } public int getId(){ return id; } public void setId(int id){ this.id = id; } /** * Test of equals method overriding vs. overloading * For exercise 1 change this method **/ public boolean equals(String otherName){ int comparisson = name.compareTo(otherName); return (comparisson == 0); } public static void main(String[] args){ // TODO code application logic here } } |
| Created dir: C:\handson2\development\javase5generics\samples(2)\OverrideAnnotation\build\classes Compiling 1 source file to C:\handson2\development\javase5generics\samples(2)\OverrideAnnotation\build\classes compile: run: BUILD SUCCESSFUL (total time: 1 second) |
| public class OverrideAnnotation { private String name; private int id; /** * Constructor **/ public OverrideAnnotation(){ name = "Java Passion!"; } public String getName(){ return name; } public void setName(String name){ this.name = name; } public int getId(){ return id; } public void setId(int id){ this.id = id; } /** * Test of equals method overriding vs. overloading * For exercise 1 change this method **/ @Override public boolean equals(String otherName){ int comparisson = name.compareTo(otherName); return (comparisson == 0); } public static void main(String[] args){ // TODO code application logic here } } |

| public class OverrideAnnotation { private String name; private int id; /** * Constructor **/ public OverrideAnnotation(){ name = "Java Passion!"; } public String getName(){ return name; } public void setName(String name){ this.name = name; } public int getId(){ return id; } public void setId(int id){ this.id = id; } /** * Test of equals method overriding vs. overloading * For exercise 1 change this method **/ @Override public boolean equals(Object otherName){ String newName = (String)otherName; int comparison = name.compareTo(newName); return (comparison == 0); } public static void main(String[] args){ // TODO code application logic here } } |
许多注释只需要附加单个值。仔细阅读包含单成员注释定义的 Mutator.java 文件。本练习的目的是编辑 AnnotatedClass.java 文件并为 setName 方法添加一个 Mutator 注释。有两种实现方法。第一种方法是按以下要求修改代码:
| @Mutator(variable = "name") public void setName(String name) |
| @Mutator("name") public void setName(String name) |
| public class MutatorAnnotation { private String name; private int id; /** * Constructor **/ public MutatorAnnotation(){ name = "Java Passion!"; } public String getName(){ return name; } @Mutator(variable = "name") public void setName(String name){ this.name = name; } public int getId(){ return id; } public void setId(int id){ this.id = id; } /** * Test of equals method overriding vs. overloading * For exercise 1 change this method **/ @Override public boolean equals(Object otherName){ String newName = (String)otherName; int comparison = name.compareTo(newName); return (comparison == 0); } public static void main(String[] args){ // TODO code application logic here } } |
| public @interface Mutator { String variable(); } |
| public class MutatorAnnotation { private String name; private int id; /** * Constructor **/ public MutatorAnnotation(){ name = "Java Passion!"; } public String getName(){ return name; } @Mutator("name") public void setName(String name){ this.name = name; } public int getId(){ return id; } public void setId(int id){ this.id = id; } /** * Test of equals method overriding vs. overloading * For exercise 1 change this method **/ @Override public boolean equals(Object otherName){ String newName = (String)otherName; int comparison = name.compareTo(newName); return (comparison == 0); } public static void main(String[] args){ // TODO code application logic here } } |
| Compiling 2 source files to C:\handson2\development\javase5generics\samples(2)\MutatorAnnotation\build\classes C:\handson2\development\javase5generics\samples(2)\MutatorAnnotation\src\MutatorAnnotation.java:18: cannot find symbol symbol : method value() location: @interface Mutator @Mutator("name") 1 error BUILD FAILED (total time:0 seconds) |

| public @interface Mutator { String value(); } |
在本练习中,您了解了如何使用两种不同的方法添加单成员注释。
返回顶部| public class MultipleMemberAnnotation { private String name; private int id; public MultipleMemberAnnotation(){ name = "Java Passion!"; } @Accessor(variableName = "name") public String getName(){ return name; } @Accessor(variableName = "name", variableType = "int") public int getId(){ return id; } public void setId(int id){ this.id = id; } /** * Test of equals method overriding v. overloading * For exercise 1 change this method **/ @Override public boolean equals(Object otherName){ String newName = (String)otherName; int comparison = name.compareTo(newName); return (comparison == 0); } public static void main(String[] args){ // TODO code application logic here } } |
| /** * Annotation definition for an accessor method. This shows the use of * multiple members. **/ public @interface Accessor { String variableName(); String variableType()default "String"; } |
| compile: Building jar: C:\handson2\development\javase5generics\samples(2)\MultipleMemberAnnotation\dist\MultipleMemberAnnotation.jar To run this application from the command line without Ant, try: java -jar "C:\handson2\development\javase5generics\samples(2)\MultipleMemberAnnotation\dist\MultipleMemberAnnotation.jar" jar: BUILD SUCCESSFUL (total time:0 seconds) |
| @Reviewer(@Name(first = "James", last = "Gosling")) public class ComplexAnnotation { public static void main(String[] args){ // TODO code application logic here } } |
| import java.lang.annotation.*; public @interface Name { String first(); String last(); } |
| import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) public @interface Reviewer { Name value(); } |
| compile: run: BUILD SUCCESSFUL (total time:0 seconds) |
| public class MetaAnnotation { private String name; @Exposed("name") public void setName(String name){ this.name = name; } public static void main(String[] args){ // TODO code application logic here } } |
| Compiling 2 source files to C:\handson2\development\javase5annotation\samples\MetaAnnotation\build\classes C:\handson2\development\javase5annotation\samples\MetaAnnotation\src\MetaAnnotation.java:6: annotation type not applicable to this kind of declaration @Exposed("name") 1 error BUILD FAILED (total time:0 seconds) |
| public class MetaAnnotation { @Exposed("name") private String name; // @Exposed("name") public void setName(String name){ this.name = name; } public static void main(String[] args){ // TODO code application logic here } } |
| @Target({ElementType.CONSTRUCTOR, ElementType.METHOD}) |
| import java.lang.annotation.*; public class RuntimeAnnotation { AnnotatedClass ac; public RuntimeAnnotation(){ ac = new AnnotatedClass(); } public void printAnnotations(){ Class c = ac.getClass(); Annotation[] annotations = c.getAnnotations(); int numberOfAnnotations = annotations.length; System.out.println("Class " + c.getName()+ " has " + numberOfAnnotations + " annotations"); for (int i = 0 ; i < numberOfAnnotations; i++){ System.out.println("Annotation " + i + ": " + annotations[i] + ", type" + annotations[i].annotationType().getName()); } } public static void main(String[] args){ RuntimeAnnotation ar = new RuntimeAnnotation(); ar.printAnnotations(); } } |
| @Reviewer(@Name(first = "James", last = "Gosling")) public class AnnotatedClass { private String name; private int id; public AnnotatedClass(){ name = "Java Passion!"; } @Accessor(variableName = "name") public String getName(){ return name; } @Mutator(variable ="name") public void setName(String name){ this.name = name; } @Accessor(variableName = "name", variableType = "int") public int getId(){ return id; } public void setId(int id){ this.id = id; } public boolean equals(String otherName){ int comparisson = name.compareTo(otherName); return (comparisson == 0); } } |
| import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) public @interface Reviewer { Name value(); } |
| import java.lang.annotation.*; public @interface Name { String first(); String last(); } |
| import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) public @interface Mutator { String variable(); } |
| import java.lang.annotation.*; /** * Annotation definition for an accessor method. This shows the use of * multiple members. **/ @Retention(RetentionPolicy.RUNTIME) public @interface Accessor { String variableName(); String variableType()default "String"; } |
| Class AnnotatedClass has 1 annotations Annotation 0: @Reviewer(value=@Name(first=James, last=Gosling)), typeReviewer |
| public @interface RequestForEnhancement { int id(); String synopsis(); String engineer()default "[unassigned]"; String date(); default "[unimplemented]"; } |