东莞专业网站建设公司做微博推广的网站吗
东莞专业网站建设公司,做微博推广的网站吗,网站制作网站开发公司,程序员和网站建设Java 中的注解#xff08;Annotation#xff09; 一、元注解1.Java 中的元注解 二、Java 中内置的三大注解三、自定义注解1.语法格式 四、反射注解五、注解的作用六、总结 所有的注解类型都继承自 java.lang.annotation.Annotation 接口。注解(Annotation)是一种引用数据类型… Java 中的注解Annotation 一、元注解1.Java 中的元注解 二、Java 中内置的三大注解三、自定义注解1.语法格式 四、反射注解五、注解的作用六、总结 所有的注解类型都继承自 java.lang.annotation.Annotation 接口。注解(Annotation)是一种引用数据类型。编译之后也是生成 xxx.class 文件。一个注解准确意义上来说只不过是一种特殊的注释而已如果没有解析它的代码它可能连注释都不如。解析一个类或者方法的注解往往有两种形式 一种是编译期直接的扫描。 Retention(RetentionPolicy.SOURCE) 编译器的扫描指的是编译器在对 java 代码编译字节码的过程中会检测到某个类或者方法被一些注解修饰这时它就会对于这些注解进行某些处理。典型的就是 Override 注解。这一种情况只适用于那些编译器已经熟知的注解类比如 JDK 内置的几个注解而你自定义的注解编译器是不知道你这个注解的作用的当然也不知道该如何处理往往只是会根据该注解的作用范围来选择是否编译进字节码文件仅此而已。 一种是运行期反射。 Retention(RetentionPolicy.RUNTIME) 一、元注解
元注解是用于修饰注解的注解通常用在注解的定义上。元注解一般用于指定某个注解生命周期以及作用目标等信息。
1.Java 中的元注解
Target注解的作用目标Documented
Retention(RetentionPolicy.RUNTIME)
Target(ElementType.ANNOTATION_TYPE)
public interface Target {/*** Returns an array of the kinds of elements an annotation interface* can be applied to.* return an array of the kinds of elements an annotation interface* can be applied to*/ElementType[] value();
}ElementType.TYPE允许被修饰的注解作用在类、接口和枚举上ElementType.FIELD允许作用在属性字段上ElementType.METHOD允许作用在方法上ElementType.PARAMETER允许作用在方法参数上ElementType.CONSTRUCTOR允许作用在构造器上ElementType.LOCAL_VARIABLE允许作用在本地局部变量上ElementType.ANNOTATION_TYPE允许作用在注解上ElementType.PACKAGE允许作用在包上 Retention注解的生命周期Documented
Retention(RetentionPolicy.RUNTIME)
Target(ElementType.ANNOTATION_TYPE)
public interface Retention {/*** Returns the retention policy.* return the retention policy*/RetentionPolicy value();
}RetentionPolicy.SOURCE当前注解编译期可见不会写入 class 文件RetentionPolicy.CLASS类加载阶段丢弃会写入 class 文件RetentionPolicy.RUNTIME永久保存可以反射获取 Documented注解是否应当被包含在 JavaDoc 文档中Inherited是否允许子类继承该注解 二、Java 中内置的三大注解
OverrideTarget(ElementType.METHOD)
Retention(RetentionPolicy.SOURCE)
public interface Override {
}它没有任何的属性所以并不能存储任何其他信息。它只能作用于方法之上编译结束后将被丢弃。仅被编译器可知编译器在对 java 文件进行编译成字节码的过程中一旦检测到某个方法上被修饰了该注解就会去匹对父类中是否具有一个同样方法签名的函数如果不是自然不能通过编译。 DeprecatedDocumented
Retention(RetentionPolicy.RUNTIME)
Target(value{CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
public interface Deprecated {String since() default ;boolean forRemoval() default false;
}可以修饰所有的类型作用是标记当前的类或者方法或者字段等已经不再被推荐使用了可能下一次的 JDK 版本就会删除。 SuppressWarnings 三、自定义注解
1.语法格式
[修饰符列表] interface 注解类型名{类型 属性() [defauult 值];
}
// 样例
Target(ElementType.TYPE)
Retention(RetentionPolicy.RUNTIME)
public interface MyAnnotation {String name() default gdb;String[] phoneNumbers() default {};
}注解当中的属性类型可以是byte short int long float double boolean char String Class 枚举类型以及以上每一种的数组形式。 四、反射注解
要求必须使用 Retention(RetentionPolicy.RUNTIME)这样该注解才能够被反射到。例子反射类上的 MyAnnotation 注解。 1.编写自己的注解 package annotation1;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;Target(ElementType.TYPE)
Retention(RetentionPolicy.RUNTIME)
public interface MyAnnotation {String name() default gdb;String[] phoneNumbers() default {};
} 2.在类上使用自己的注解 package annotation1;MyAnnotation(name zhangsan, phoneNumbers {123456, 654321})
public class MyAnnotationTest {}3.通过反射机制来获取指定类上的注解信息 package annotation1;import java.util.Arrays;public class ReflectAnnotation {public static void main(String[] args) throws Exception {//获取类Class? c Class.forName(annotation1.MyAnnotationTest);//判断类上面是否有 MyAnnotationif (c.isAnnotationPresent(MyAnnotation.class)){//获取注解对象MyAnnotation myAnnotation (MyAnnotation)c.getAnnotation(MyAnnotation.class);//获取注解对象的属性和调用接口没有区别System.out.println(myAnnotation.name() , Arrays.toString(myAnnotation.phoneNumbers()));}//判断 Date 类上面是否有 MyAnnotation 这个注解。Class? s Class.forName(java.lang.String);System.out.println(s.isAnnotationPresent(MyAnnotation.class));}
}五、注解的作用 注解在程序当中等同于一种标记如果这个元素上有这个注解怎么办没有这个注解怎么办。 应用场景假设有这样一个注解叫做 Id这个注解只能出现在类上面当这个类上有这个注解的时候要求这个类中必须有一个 int 类型的 id 属性。如果没有这个属性就报异常。如果有这个属性就正常执行。 1.编写 Id 注解 package annotation1;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;Target(ElementType.TYPE)
Retention(RetentionPolicy.RUNTIME)
public interface Id {}2.编写异常类 package annotation1;public class NotHasIdException extends RuntimeException{public NotHasIdException() {}public NotHasIdException(String message) {super(message);}
}3.编写使用 Id 注解的类 package annotation1;Id
public class IdAnnotationTest {int id;
}4.通过反射机制来判断是否正确 package annotation1;import java.lang.reflect.Field;public class ReflectAnnotation {public static void main(String[] args) throws Exception {//获取类Class? c Class.forName(annotation1.IdAnnotationTest);//判断类上面是否有 Id 注解if (c.isAnnotationPresent(Id.class)){//当一个类上面有 Id 注解的时候要求类中必须存在 int 类型的id属性。//如果没有int类型的id属性则报异常。//获取类的所有属性Field[] fields c.getDeclaredFields();boolean isOK false;for(Field field : fields){if(id.equals(field.getName()) int.equals(field.getType().getSimpleName())){isOK true;break;}}//判断是否合法if (!isOK)throw new NotHasIdException(被Id注解标注的类没有int类型的id属性);}}
}六、总结
如果一个注解的属性的名字是 value并且只有一个属性的话在使用的时候该属性名可以省略。如果属性是一个数组如果数组中只有一个元素大括号可以省略。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/86927.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!