JAVA 注解的几大作用及使用方法详解
java 注解,从名字上看是注释,解释。但功能却不仅仅是注释那么简单。注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解析注解 来使用这些数据),常见的作用有以下几种:
Java注解(Annotation):
a) Override注解表示子类要重写(override)父类的对应方法。
b) Deprecated注解表示方法是不建议被使用的。
c) SuppressWarnings注解表示抑制警告。
3. 自定义注解:当注解中的属性名为value时,在对其赋值时可以不指定属性的名称而直接写上属性值即可;除了value以外的其他值都需要使用name=value这种赋值方式,即明确指定给谁赋值。
4. 当我们使用@interface关键字定义一个注解时,该注解隐含地继承了java.lang.annotation.Annotation接口;如果我们定义了一个接口,并且让该接口继承自Annotation,那么我们所定义的接口依然还是接口而不是注解;Annotation本身是接口而不是注解。可以与Enum类比。
5. JUnit(3.8、4.x):Keep the bar green to keep the code clean.
6. 我的名言:没有反射,很多框架就不存在了。(No Reflection,No most frameworks)。
7. JUnit4的执行的一般流程:
a) 首先获得待测试类所对应的Class对象。
b) 然后通过该Class对象获得当前类中所有public方法所对应的Method数组。
c) 遍历该Method数组,取得每一个Method对象
d) 调用每个Method对象的isAnnotationPresent(Test.class)方法,判断该方法是否被Test注解所修饰。
e) 如果该方法返回true,那么调用method.invoke()方法去执行该方法,否则不执行。
8. 单元测试不是为了证明你是对的,而是证明你没有错误。
9. Writing Secure Code(编写安全的代码):Input is evil。
Override.java
public class OverrideTest { @Override public String toString() { return "This is OverrideTest"; } public static void main(String[] args) { OverrideTest test = new OverrideTest(); System.out.println(test); } }
不过不加上@Override代表在本类定义的一个新的方法.
DeprecatedTest.java
public class DeprecatedTest { @Deprecated public void doSomething() { System.out.println("do something!"); } public static void main(String[] args) { DeprecatedTest test = new DeprecatedTest(); test.doSomething(); // Date date = new Date(); // // System.out.println(date.toLocaleString()); } }
SuppressWarningsTest.java
public class SuppressWarningsTest { @SuppressWarnings({ "unchecked", "deprecation" }) public static void main(String[] args) { Map map = new TreeMap(); map.put("hello", new Date()); System.out.println(map.get("hello")); Date date = new Date(); System.out.println(date.toLocaleString()); } }
自定义注解
AnnotationTest.java
public @interface AnnotationTest { String[] value1() default "hello"; EnumTest value2(); } enum EnumTest { Hello, World, Welcome; }
AnnotationUsage.java
@AnnotationTest(value2 = EnumTest.Welcome) public class AnnotationUsage { @AnnotationTest(value1 = { "world", "ABCD" }, value2 = EnumTest.World) public void method() { System.out.println("usage of annotation"); } public static void main(String[] args) { AnnotationUsage usage = new AnnotationUsage(); usage.method(); } }
>>>>>>>>
MyAnnotation.java
@Retention(RetentionPolicy.CLASS) public @interface MyAnnotation { String hello() default "shengsiyuan"; String world(); }
MyTest.java
@MyAnnotation(hello = "beijing", world = "shanghai") public class MyTest { @MyAnnotation(hello = "tianjin", world = "shangdi") @Deprecated @SuppressWarnings("unchecked") public void output() { System.out.println("output something!"); } }
MyReflection.java
1 public class MyReflection { 2 public static void main(String[] args) throws Exception { 3 MyTest myTest = new MyTest(); 4 5 Class<MyTest> c = MyTest.class; 6 7 Method method = c.getMethod("output", new Class[] {}); 8 9 if (method.isAnnotationPresent(MyAnnotation.class)) { 10 method.invoke(myTest, new Object[] {}); 11 12 MyAnnotation myAnnotation = method 13 .getAnnotation(MyAnnotation.class); 14 15 String hello = myAnnotation.hello(); 16 String world = myAnnotation.world(); 17 18 System.out.println(hello + ", " + world); 19 } 20 21 Annotation[] annotations = method.getAnnotations(); 22 23 for (Annotation annotation : annotations) { 24 System.out.println(annotation.annotationType().getName()); 25 } 26 27 } 28 }
>>>>>>
MyTarget.java
@Target(ElementType.METHOD) public @interface MyTarget { String value(); }
MyTargetTest.java
public class MyTargetTest { @MyTarget("hello") public void doSomething() { System.out.println("hello world"); } }
本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/4217229.html,如需转载请自行联系原作者