- 浏览: 409258 次
- 性别:
- 来自: 秦皇岛
最新评论
-
prayjourney:
了解了,讲的不错
DataInputStream和DataOutputStream类 -
niunianss:
将字节退回的时候,需要添加判断,最后一个字符是英文时,实际数组 ...
PushbackInputStream -
cctt_1:
不要误人子弟,那根本就不是 解释器模式!!!那是Composi ...
Interpreter(解释器)模式 -
java-大神:
[i][i]引用引用引用引用[/img][/img][/img ...
BufferedReader和BufferedWriter -
百合不是茶:
你的程序在文件输入输出流中传入agrs[0]时,会报错越界 ...
DataInputStream和DataOutputStream类
1. 所谓meta-annotation就是Annotation类型的数据,也就是Annotation类型的Annotation,在定义Annotation类型时,为Annotation类型加上Annotation可以为处理Annotation类型的分析工具提供更多的信息。
2. java.lang.annotation.Retention类型可以在您定义Annotation类型时,指示编译器该如何对待自定义的Annotation类型,编译器默认会将Annotation信息留在.class文件中,但不被JVM读取,而仅用于编译器或工具程序运行时提供信息。
3. 在使用Retention类型时,需要提供java.lang.annotation.RetentionPolicy的枚举类型。RetentionPolicy的枚举类型定义如下所示:
package java.lang.annotation; public enum RetentionPolicy { SOURCE, //编译器处理完Annotation信息后就没事了 CLASS, //编译器将Annotation存储于class文件中,默认 RUNTIME, //编译器将Annotation存储于class文件中,可由VM读入 }
RetentionPolicy为SOURCE的例子是@SuppressWarning,这个信息的作用仅在编译时期告知编译器来抑制,所以不必将这个信息存储于.class文件中。
RetentionPolicy为RUNTIME的时机,可以像是您使用Java设计一个程序代码分析工具,您必须让VM能读出Annotation信息,以便在分析程序时使用,搭配反射机制,就可以达到这个目的。
J2SE 5.0新增了java.lang.reflect.AnnotatedElement接口,其中定义有4个方法:
public Annotation getAnnotation(Class annotationType); public Annotation[] getAnnotations(); public Annotation[] getDeclaredAnnotations(); public boolean isAnnotationPresent(Class annotationType);
Class,Field,Method,Package,Constructor等类,都实现了AnnotatedElement接口,所以可以从这些类实例上,分别取得标示于其上的Annotation与相关信息。由于是在执行时期读取Annotation信息,所以定义Annotation时必须设定RententionPolicy为RUNTIME,也就是可以在VM中读取Annotation信息。举例来说,假设设计了一个如下的Annotation。
package ysu.hxy; import java.lang.annotation.Retention; import java.lang.annotaion.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface someAnnotation { String value(); String name(); }
由于RetentionPolicy为RUNTIME,编译器在处理SomeAnnotation时,会将Annotation及给定的相关信息编译至.class文件中,并设定为VM可以读出Annotation信息。接着可以使用如下范例来使用我们刚才定义的SomeAnnotaion。
package ysu.hxy; public class SomeClass3 { @SomeAnnotation( value = "annotation value1", name = "annotation name1" ) public void doSomething() { //... } }
现在假设要设计一个源代码分析工具来分析所设计的类,一些分析时所需的信息已经使用Annotation标示于类中了,可以在执行时读取这些Annotation的相关信息。下面是个简单的范例:
package ysu.hxy; import java.lang.annotation.Annotation; import java.lang.reflect.Method; public class AnalysisApp { public static void main(String[] args) throws NoSuchMethodException { Class<SomeClass3> c= SomeClass3.class; // 因为SomeAnnotation标示于doSomething()方法上 //所以要取得doSomething()方法的Method实例 Method method = c.getMethod("doSomething"); //如果SomeAnnotation存在 if(method.isAnnotationPresent(SomeAnnotation.class)) { System.out.println("找到@Annotation"); //取得Annotation SomeAnnotation annotation = method.getAnnotation(SomeAnnotation.class); //取得value成员值 System.out.println("\tvalue = " + annotation.value()); //取得name成员值 System.out.println("\tname = " + annotation.name()); } else { System.out.println("没有找到@SomeAnnotation"); } //取得doSomething()方法上所有的Annotation Annotation[] annotations = method.getAnnotations(); //显示Annotation名称 for(Annotation annotation : annotations) { System.out.println("Annotation名称:"+ annotation.annotationType().getName()); } } }
若Annotation标示于方法上,就要取得方法的Method代表实例。同样地如果Annotation标示于类或包上,就要分别取得类的Class代表实例或者包的Package代表实例。之后可以使用实例上的getAnnotation()等相关方法,以测试是否可取得Annotation或进行其他操作。此示例的执行结果如下:
D:\hxy>java ysu.hxy.AnalysisApp
找到@Annotation
value = annotation value1
name = annotation name1
Annotation名称:ysu.hxy.SomeAnnotation
4. 限定Annotation使用对象@Target
在定义Annotation类型时,使用java.lang.annotation.Target可以定义其适用的时机。在定义时要指定java.lang.annotation.ElementType的枚举值之一:
package ysu.hxy; public enum ElementType { TYPE, //适用class,interface,enum FIELD, //适用field METHOD,//适用method PARAMETER, //适用method之上的parameter CONSTRUCTOR, //适用constructor LOCAL_VARIABLE, // 适用区域变量 ANNOTATION_TYPE, //适用annotation类型 PACKAGE //适用package }
举例说明,假设定义Annotation类型时,要限定它只能适用于构造函数与方法成员,则可以用以下代码来定义:
package ysu.hxy; import java.lang.annotation.Target; import java.lang.annotation.ElementType; @Target({ElementType.CONSTRUCTOR,ElementType.METHOD}) public @interface MethodAnnotation{}
如果尝试将MethodAnnotation标示于类之上,例如:
@ysu.hxy.MethodAnnotation public class SomeoneClass { public void doSomething() { //.... } }
编译时会发生以下错误:
D:\hxy>javac -d . SomeoneClass.java
SomeoneClass.java:1: 注释类型不适用于该类型的声明
@ysu.hxy.MethodAnnotation
^
1 错误
5. 要求为API文件的一部分@Documented
在制作Java Doc文件时,并不会默认将Annotation的数据加入到文件中,例如设计了以下的OneAnnotaion类型:
package ysu.hxy; public @interface OneAnnotation{}
并次之用在以下的程序中:
public class SomeoneClass { @ysu.hxy.OneAnnotation public void doSomething() { //... } }
试着使用javadoc程序来产生Java Doc文件,会以现文件中并不会有Annotation的相关信息。Annotation用于标示程序代码以便分析工具使用相关信息,有时Annotation包括了重要的信息,您也许会想要在使用者制作Java Doc文件的同时,也一并将Annotation的信息加入至API文件中,所以在定义Annotation类型时,可以使用java.lang.annotation.Documented。如下范例:
package ysu.hxy; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Documented @Retention(RetentionPolicy.RUNTIME) public @interface TwoAnnotation{}
使用java.lang.annotation.Documented为定义的Annotation类型加上Annotation时,必须同时使用Retention来指定编译器将信息加入.class文件,并可以由VM读取,也就是要设定RententionPolicy为RUNTIME。接着可以使用这个Annotation,并产生Java Doc文件,这时可以看到文件中包括了@TwoAnnotation信息。
6. 子类是否继承父类的annotation@Inherited
在定义Annotation类型并使用于程序代码上后,默认父类中的Annotation并不会被继承至子类中。可以在定义Annotation类型时加上java.lang.Annotation.Inherited类型的Annotation,这让您定义的Annotation类型在被继承后仍可以保留在子类中。
package ysu.hxy; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotaion.Inherited; @Retention(RetentionPolicy.RUNTIME} @Inherited public @interface ThreeAnnotation { String value(); String name(); }
可以在下面的程序中使用@ThreeAnnotaion:
public class SomeoneClass { @ysu.hxy.ThreeAnnotation ( value = "unit", name = "debug1" ) public void doSomething() { //.... } }
如果有一个类继承了SomeoneClass类,则理想上@ThreeAnnotation也会被继承下来。不过事实上@Inherited在Sun JDK 5.0里还没有作用。
发表评论
-
内部类总结
2009-11-27 14:28 1222一、方法及作用域内的内部类:1.在一个方法内定义的类2.在一个 ... -
finalize()方法终结条件验证 示例代码
2009-09-20 09:23 1348package Initialization; clas ... -
Proxy(代理)模式二
2009-05-15 21:16 15532. 重新思考图像代理: 现在需要思考设计模式是否 ... -
Junit简介
2009-04-08 17:46 16491. 单元测试(Unit Test) 一个单元(Un ... -
Ant简介
2009-04-08 13:10 18531. Ant可以自动完成的任务: (1)编译Java源代 ... -
专题制作--文字编辑器(文字编辑与保存)
2009-04-08 10:43 22151. 文字编辑与保存: (1). 打开文件的处理流 ... -
专题制作--文字编辑器(逻辑实现部分)
2009-04-07 22:35 19061. 事件处理: 在Java中事件以具体的对象来表 ... -
专题制作--文字编辑器(接口部分)
2009-04-07 20:28 21491. Swing入门: 若要使用J2SE来开发窗口应用 ... -
信息绑定(国际化处理)
2009-04-07 20:02 15841. 程序中的一些文字信息可以将之定义在一个属性文件中,而不定 ... -
日志(Logging)
2009-04-07 16:14 17281. 日志(Logging) 程序不免会出现错误,当 ... -
Java中的日期和时间
2009-04-07 11:26 19581. 使用Date: 使用System.cu ... -
Annotion
2009-04-06 23:05 16831. Annotation对程序运行没有影响,它的目的在于对编 ... -
使用反射生成与操作对象(二)
2009-04-06 17:04 17561. 修改成员值: 尽管直接存取类的域成员是不被鼓励的 ... -
使用反射生成与操作对象(一)
2009-04-06 15:16 21091. 使用反射机制,可以在运行时期动态加载类并生成对象,操作对 ... -
Java中的反射(二)
2009-04-06 10:42 20761. 当在命令行模式下执行java XXX.class 指令后 ... -
Java中的反射(一)
2009-04-06 09:43 13921. Java提供的反射机制允许您在运行时动态加载类、查看类信 ... -
容器类的线程安全及ThreadLocal类
2009-04-05 21:28 30571. 容器类默认没有考虑 ... -
wait()和notify()
2009-04-05 19:06 13711. wait()、notify()、notifyAll() ... -
Java线程之同步化(Synchronized)主题
2009-04-05 16:44 27141. 如果一个对象所持有的数据可以被多线程同时共享存取,必须 ... -
Java线程(三)
2009-04-05 15:37 18921. Java中的每个线程都 ...
相关推荐
@Documented meta-annotation 用于描述其他类型的 annotation 应该被作为被标注的程序成员的公共 API,因此可以被例如 javadoc 此类的工具文档化。 4. @Inherited @Inherited meta-annotation 阐述了某个被标注的...
- Meta-Annotation是用于定义其他Annotation的Annotation,例如`@Retention`定义Annotation的保留策略,`@Target`指定Annotation可以应用到哪些程序元素上。 五、Annotation的保留策略 - Annotation的生命周期由`@...
- **定义**:Meta-Annotation 是 Annotation 的 Annotation,即一个 Annotation 可以应用到另一个 Annotation 上。 - **示例**:`@Target` 和 `@Retention` 都是 Meta-Annotation,它们分别用于控制 Annotation 的...
四、元注解(Meta-Annotations) 元注解是用于注解其他注解的注解,如`@Retention`、`@Target`、`@Documented`和`@Inherited`。这些元注解控制了注解的行为,如保留策略、应用范围等。 - `@Retention`:定义注解的...
#### 六、标准Annotation与Meta-Annotation Java提供了几个内置的注解类型,如`@Override`、`@Deprecated`和`@SuppressWarnings`,以及用于控制注解行为的元注解,如`@Retention`、`@Target`和`@Documented`。 - *...
2. **元注解(Meta-Annotation)** - 元注解是用于定义注解的注解,Java提供了四个标准元注解: - `@Target`:定义注解能被应用到哪些程序元素,如类、方法、变量等。 - `@Retention`:决定注解的生命周期,何时...
在Java中,元注解(meta-annotation)用于定义自己的Annotation类型。元注解包括`@Retention`(控制Annotation的生命周期,如是否存储在class文件或运行时可见)、`@Target`(指定Annotation可以应用到哪些程序元素...
`rush-annotation-processor`是一个基于Rush框架构建的扩展注释处理器,它专为提升开发效率和代码质量而设计。 首先,我们需要理解什么是Rush。Rush是微软开发的一套多项目管理工具,用于管理和构建大型的、依赖...
这个“hello-world-annotation-processing”项目是一个简单的示例,它展示了如何利用Java注释处理API来创建自定义的注解处理器,以此实现特定的功能。在这个“你好,世界!”的示例中,我们可能看到一个简单的注解被...
8. **元注解(Meta-Annotation)** 元注解是用于定义其他注解的注解。例如,`@Retention`控制注解的生命周期,`@Target`定义注解可以应用的位置,`@Documented`指示是否应包含在Javadoc中,`@Inherited`表明子类...
在`java-annotation-processor-master`这个项目中,你可以找到一个关于如何创建和使用Java注释处理器的示例。该项目可能包含以下几个部分: - `src/main/java`: 存放注解处理器和相关注解的源代码。 - `src/main/...
元注解(Meta-Annotation) ------------------------ 元注解是给注解添加注解,以提供更多的信息。Java 5.0定义了4个标准的元注解类型: 1. `@Target`:说明了Annotation所修饰的对象范围,即注解的作用域。 2. `...
7. **元注解(Meta-Annotations)** - 元注解是用于定义其他注解的注解,例如`@Retention`和`@Target`本身就是元注解。 - 通过元注解,可以为自定义注解添加额外的元信息,如保留策略、目标等。 8. **Spring框架...
- 自定义注解通常需要使用元注解(meta-annotation)。Java 提供了几个内置的元注解,如 `@Retention`、`@Target`、`@Inherited` 和 `@Documented`。 - `@Retention` 定义了注解的生命周期,有三个策略: - `...
2. **元注解(Meta-Annotation)**:元注解是用于定义其他注解的注解。例如,`@Target`定义了注解可以应用在哪些程序元素上,`@Retention`定义注解的保留策略,`@Documented`指示是否将注解包含在Javadoc中,`@...
在Spring框架中,元注解(Meta-Annotation)是一种用于注解其他注解的特殊注解,它使得Spring能够提供更灵活的注解功能。元注解的使用始于Spring 2.5版本,目的是减少XML配置,提升开发效率。Spring Boot进一步推广...
3. **元注解(Meta-Annotation)**:元注解是用于注解其他注解的注解。在`aptdemo`中,可能会使用`@Retention`、`@Target`等元注解来定义自定义注解的生命周期和应用范围。 4. **代码生成(Code Generation)**:...
9. **元数据注解处理(Meta-Annotation Processing)**:允许元注解,即注解可以被应用于其他的注解上,扩展了注解的使用范围。 10. **增强的调试和分析工具**:JDK 6.0的JConsole、VisualVM等工具提供了更强大的...
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod ``` 这里的`-keep`规则用于指定需要保留的类或方法,避免混淆后导致运行时错误。你可以...
前言 公司前端项目用的是vue,后端用的是Springboot。因为最近公司业务的原因,需要根据条件限制接口的调用。限制的条件是根据指定的key获取...1.元注解(meta-annotation) 元注解的作用就是负责注解其他注解,在java.