java注解小结
java注解小结:
java中的注解一共有三个层次:
1.内置注解
2.声明注解
3.注解中的注解
一.内置注解包括:
1.@Deprecated:这个方法或类不再建议使用
2.@Override:这个方法是从父类/接口 继承过来的
3.@SafeVarargs:如果参数传递的是不可具体化的类型,会产生警告信息
4.@SuppressWarnings:告诉编译器忽略指定的警告,不用在编译完成后出现警告信息。
二.声明注解:
是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。
1.Mark注解:这类注解没有任何元素,用于告知其他开发人员-----被注解的方法,尚未被实现:如
@interface isNotImplements{} public class AnnoatationDemo{ @isNotImplements public void isNotImplementFunction(){ } }
2.单值注解:这类注解只接收单值类型,数据成员由value指定的,如:
@interface Task1{ String value(); } @interface Task2{ int value(); } public class AnnoatationDemo{ @isNotImplements public void isNotImplementMethod(){ } @Task1(value = "singlevalu") public void task1Method(){ } @Task2(value = 0) public void task2Method(){ } }
3.多值注解:这类注解可以接收多个值,这些值的描述由自己定义,如:
1. 首先是自定义注解:
package cn.veji.hibernate.po; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Privilege { String[] value(); }
2.定义使用注解类:
package cn.veji.hibernate.po; package cn.veji.hibernate.po; public class TestPrivilege { @Privilege( { "a" }) public void a() { } @Privilege( { "b" }) public void b() { } @Privilege( { "c" }) public void c() { } }
3.读取注解值帮助类:
package cn.veji.hibernate.po; package cn.veji.hibernate.test; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import cn.veji.hibernate.po.Privilege; import cn.veji.hibernate.po.TestPrivilege; public class AnnotationUtil { public static AnnotationUtil anno = null; public static AnnotationUtil getInstance() { if (anno == null) { anno = new AnnotationUtil(); } return anno; } /** * 读取注解值 * * @param annotationClasss 处理Annotation类名称 * @param annotationField 处理Annotation类属性名称 * @param className 处理Annotation的使用类名称 * @return * @throws Exception */ @SuppressWarnings("all") public Map<String, String> loadVlaue(Class annotationClasss, String annotationField, String className) throws Exception { System.out.println("处理Annotation类名称 === "+annotationClasss.getName()); System.out.println("处理Annotation类属性名称 === "+annotationField); System.out.println("处理Annotation的调用类名称 === "+className); Map<String, String> map = new HashMap<String, String>(); Method[] methods = Class.forName(className).getDeclaredMethods(); for (Method method : methods) { if (method.isAnnotationPresent(annotationClasss)) { Annotation p = method.getAnnotation(annotationClasss); Method m = p.getClass() .getDeclaredMethod(annotationField, null); String[] values = (String[]) m.invoke(p, null); for (String key : values) { System.out.println("注解值 === " + key); map.put(key, key); } } } System.out.println("map数量 === " + map.size()); return map; } public static void main(String[] args) throws Exception { AnnotationUtil.getInstance().loadVlaue(Privilege.class, "value", TestPrivilege.class.getName()); } }
4.执行结果:
处理Annotation类名称 === cn.veji.hibernate.po.Privilege 处理Annotation类属性名称 === value 处理Annotation的调用类名称 === cn.veji.hibernate.po.TestPrivilege 注解值 === c 注解值 === a 注解值 === b map数量 === 3
3.为注解添加注解
1.Tartget注解:该注解用于指定代码中的哪些元素可以使用已定义类型的注解,如:
@Target(ElementType.METHOD)//表示该注解只能作用于方法 @interface Task1{ }2.Retention注解:该注解用于设置注解的可见性(编译器可见,工具可见,运行时可见)
@Retention(RetentionPolicy.RUNTIME)//运行时可见 @interface Task2{ } @Retention(RetentionPolicy.CLASS)//工可见 @interface Task3{ } @Retention(RetentionPolicy.SOURCE)//编译器可见 @interface Task4{ }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。