zoukankan      html  css  js  c++  java
  • Java 注解 Annotation

    一、Annotation工作方式

    从Java5.0版本发布以来,5.0平台提供了一个正式的annotation功能:允许开发者定义、使用自己的annotation类型。

    此功能由一个定义annotation类型的语法和一个描述annotation声明的语法,读取annotation的API,一个使用annotation

    修饰的class文件,一个annotation处理工具(apt)组成。

    annotation并不直接影响代码语义,但是它能够工作的方式被看做类似程序的工具或者类库

    它会反过来对正在运行的程序语义有所影响。 annotation可以从原文件、class文件或者以运行时反射的多种方式读取。

    二、Java注解

    1、Override注解

        表示子类要重写(override)父类的对应方法

        java.lang.Override是个Marker annotation,用户标识的Annotation,Annotation名称本身即表示了要给工具程序的信息

    2、 Deprecated注解

        表示方法是不建议被使用的。

    3、SuppressWarning注解

      表示抑制警告

    三、自定义注解

    1.定义一个注解

    public @interface AnnotationTest {
    	//属性value
    	String value();
    }
    

      

    使用注解

    @AnnotationTest("hello")
    public class AnnotationUsage {
    	
    	@AnnotationTest("world")
    	public void method() {
    		System.out.println("usage of annotation");
    	}
    	
    	public static void main(String[] args) {
    		AnnotationUsage usage = new AnnotationUsage();
    		usage.method();
    	}
    }
    

      

    2、 给注解增加默认值和枚举值

    public @interface AnnotationTest {
    	//属性value,default设置默认值
    	String value() default "hello";
    	EnumTest value2();
    }
    
    enum EnumTest{
    	Hello,
    	World,
    	Welcome;
    }
    

      使用注解

    @AnnotationTest(value2 = EnumTest.Welcome)
    public class AnnotationUsage {
    	
    	@AnnotationTest(value="world", value2 = EnumTest.World)
    	public void method() {
    		System.out.println("usage of annotation");
    	}
    	
    	public static void main(String[] args) {
    		AnnotationUsage usage = new AnnotationUsage();
    		usage.method();
    	}
    }
    

      

    三、注解的调用

    1、创建注解

    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyAnnotation {
    	
    	String hello() default "tom";
    	
    	String world();
    }
    

      

    2、在类和方法中使用注解

    @MyAnnotation(hello="beijing", world="shanghai")
    public class MyTest {
    	
    	@MyAnnotation(hello="hangzhou", world="xihu")
    	@Deprecated
    	@SuppressWarnings("unchecked")
    	public void output() {
    		System.out.println("output something");
    	}
    }
    

      

    3、使用反射测试

    public class MyReflection {
    	
    	public static void main(String[] args) throws Exception {
    		MyTest myTest = new MyTest();
    		Class<MyTest> c = MyTest.class;
    		Method method = c.getMethod("output", new Class[]{});
    		if(method.isAnnotationPresent(MyAnnotation.class)){
    			
    			method.invoke(myTest, new Object[]{});
    			MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
    			String hello = myAnnotation.hello();
    			String world = myAnnotation.world();
    			System.out.println(hello + ", " + world);
    		}
    		
    		Annotation[] annotations = method.getAnnotations();
    		for(Annotation annotation : annotations){
    			System.out.println(annotation.annotationType().getName());
    		}
    	}
    }
    

      输出结果

    output something
    hangzhou, xihu
    com.example.annotation.MyAnnotation
    java.lang.Deprecated
    

      

     四、Target的使用

    1、定义一个注解,target为方法,只能被方法使用

    @Target(ElementType.METHOD)
    public @interface MyTarget {
    	String value();
    }
    

      

    2.使用

    如上图,类中使用该注解就会报错。

  • 相关阅读:
    C#利用反射动态调用类及方法
    系统程序监控软件
    SQL server 2008 安装和远程访问的问题
    sql server 创建临时表
    IIS 时间问题
    windows 2008 安装 sql server 2008
    sql server xml nodes 的使用
    Window 7sp1 安装vs2010 sp1 打开xaml文件崩溃
    CSS资源网址
    Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0
  • 原文地址:https://www.cnblogs.com/linlf03/p/9871047.html
Copyright © 2011-2022 走看看