首页 > 编程知识 正文

transactional注解参数,configuration注解的作用

时间:2023-05-03 17:15:53 阅读:175393 作者:2718

@Retention作用是定义被它所注解的注解保留多久,共有三种策略,定义在RetentionPolicy枚举中。

从评论来看:

source :注释仅保留在源文件中,并且在将Java文件编译为class文件时,注释将被丢弃。 被编译器忽略

class :注释保留在class文件中,但在jvm加载class文件时被丢弃。 这是默认的生命周期

runtime :注释不仅保存在class文件中,而且在jvm加载class文件后也会存在

这三个生命周期分别对应于Java源文件---Java文件--- .class文件---内存中的字节码。

那么,如何选择合适的评论生命周期?

首先要明确生命周期长SOURCE CLASS RUNTIME,所以前者发挥作用的地方后者也一定发挥作用。 一般在http://www.Sina.com/在运行时去动态获取注解信息,那只能用RUNTIME 注解的情况下,使用例如ButterKnife的辅助代码http://www.Sina.com /;在编译时进行一些预处理操作,例如对于@Override和@SuppressWarnings,3358www.Sina.com/。

本节介绍了运行时注释的简单运用。

获取注释

需要通过反射获取运行时的注释。 可以从Package、Class、Field、Method .中获取。 基本方法是一样的。 一般方法如下。

/** *指定类型的注释*/publicaextendsannotationagetannotation (classaannotationtype ); /**获取所有评论。 如果有*/public annotation [ ] get annotations (); /**继承的注释* /公共注释[ ] getdeclaredannotations (); 指定/**注释是否存在于元素中,如果存在,则返回true;如果不存在,则返回false */publicbooleanisannotationpresent (class? 扩展sannotationannotationtype; 获取/**method中参数的所有注释

*/ public Annotation[][] getParameterAnnotations();

要使用这些函数必须先通过反射获取到对应的元素:Class、Field、Method 等。

自定义注解

来看下自定义注解的简单使用方式,这里先定义3个运行时注解:

// 适用类、接口(包括注解类型)或枚举 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface ClassInfo { String value(); } // 适用field属性,也包括enum常量 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface FieldInfo { int[] value(); } // 适用方法 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MethodInfo { String name() default "long"; String data(); int age() default 27; } 这3个注解分别适用于不同的元素,并都带有不同的属性,在使用注解是需要设置这些属性值。

再定义一个测试类来使用这些注解:

/** * 测试运行时注解 */ @ClassInfo( "Test Class") public class TestRuntimeAnnotation { @FieldInfo(value = { 1, 2}) public String fieldInfo = "FiledInfo"; @FieldInfo(value = { 10086}) public int i = 100; @MethodInfo(name = "BlueBird", data = "Big") public static String getMethodInfo() { return TestRuntimeAnnotation.class.getSimpleName(); } }

使用还是很简单的,最后来看怎么在代码中获取注解信息:

/** * 测试运行时注解 */ private void _testRuntimeAnnotation() { StringBuffer sb = new StringBuffer(); Class<?> cls = TestRuntimeAnnotation.class; Constructor<?>[] constructors = cls.getConstructors(); // 获取指定类型的注解 sb.append( "Class注解:").append( "n"); ClassInfo classInfo = cls.getAnnotation(ClassInfo.class); if (classInfo != null) { sb.append(Modifier.toString(cls.getModifiers())).append( " ") .append(cls.getSimpleName()).append( "n"); sb.append( "注解值: ").append(classInfo.value()).append( "nn"); } sb.append( "Field注解:").append( "n"); Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { FieldInfo fieldInfo = field.getAnnotation(FieldInfo.class); if (fieldInfo != null) { sb.append(Modifier.toString(field.getModifiers())).append( " ") .append(field.getType().getSimpleName()).append( " ") .append(field.getName()).append( "n"); sb.append( "注解值: ").append(Arrays.toString(fieldInfo.value())).append( "nn"); } } sb.append( "Method注解:").append( "n"); Method[] methods = cls.getDeclaredMethods(); for (Method method : methods) { MethodInfo methodInfo = method.getAnnotation(MethodInfo.class); if (methodInfo != null) { sb.append(Modifier.toString(method.getModifiers())).append( " ") .append(method.getReturnType().getSimpleName()).append( " ") .append(method.getName()).append( "n"); sb.append( "注解值: ").append( "n"); sb.append( "name: ").append(methodInfo.name()).append( "n"); sb.append( "data: ").append(methodInfo.data()).append( "n"); sb.append( "age: ").append(methodInfo.age()).append( "n"); } } System.out.print(sb.toString()); }

所做的操作都是通过反射获取对应元素,再获取元素上面的注解,最后得到注解的属性值。

看一下输出情况,这里我直接显示在手机上:



这个自定义运行时注解是很简单的例子,有很多优秀的开源项目都有使用运行时注解来处理问题,有兴趣可以找一些来研究。因为涉及到反射,所以运行时注解的效率多少会受到影响,现在很多的开源项目使用的是编译时注解,关于编译时注解后面再来详细介绍。


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。