- 浏览: 622318 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
xianzi_2008:
xianzi_2008 写道楼主请教下,我缓存了一个List& ...
Ehcache -
xianzi_2008:
楼主请教下,我缓存了一个List<Bean>对象, ...
Ehcache -
jsdsh:
收藏好.五个字
hibernate之one-to-many详细 -
Tlife:
好!!!!
hibernate------HQL总结 -
yanqingluo:
例子很恰当。
观察者模式
Annotation接口的实现类: Documented, Inherited, Retention, Target 都是用来定义自己定义的Annotation类的。
1. 注解(Annotation)类,以@interface 修饰 ,不能显示(explicit)extends或implements任何类
如:
java 代码
- public @interface DefineAnnotation {
- }
这种没有任何属性的Annotation类,也叫标识Annotation
2. 定义属性
java 代码
- //属性必须加个小括号
- public String value() ;
- //有默认值的属性
- public String value() default "aaa";
完整定义如下:
java 代码
- //注解Annotation类不能显示(explicit)extends或implements任何类
- //不定义任何属性就叫maket annotation
- public @interface DefineAnnotation {
- //定义一个属性,有属性的话,必须赋值,除非有默认default
- public String value() default "aaa";
- }
3.使用Annotation,有默认值的可以不用传参数,也可以传递参数。没有默认值的,必须传递参数。
如:
java 代码
- public class TestAnnotation {
- // @DefineAnnotation 有默认值的第一种使用方式
- // @DefineAnnotation() 有默认值的第二种使用方式
- @DefineAnnotation("ttitfly")
- public void say(){
- System.out.println("say hello");
- }
- public static void main(String[] args){
- TestAnnotation ta = new TestAnnotation();
- ta.say();
- }
- }
4. Retention (保存)
所有的Annotation类都实现了Annotation接口
@Retention本身就是个Annotation(注解)类
它的值是个enum枚举类型的RetentionPolicy,该枚举类型RetentionPolicy有三个值RUNTIME (会被JVM加载,并可以通过反射来获得到Annotation类的信息) ,CLASS (不会被JVM加载),Source
@Retention的值标识自己定义的Annotation(注解)类 是属于哪种保存策略,将来哪个类如果使用了这个自定义的注解类,将会使用这种保存策略
如:
java 代码
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- //所有的Annotation类都实现了Annotation接口
- //@Retention本身就是个Annotation(注解)类
- //它的值是个enum枚举类型的RetentionPolicy,该枚举类型RetentionPolicy有三个值RUNTIME (会被JVM加载,并可以通过反射来获得到Annotation类的信息) ,CLASS (不会被JVM加载),Source
- //@Retention的值标识自己定义的Annotation(注解)类 是属于哪种保存策略,将来哪个类如果使用了这个自定义的注解类,将会使用这种保存策略
- @Retention(RetentionPolicy.RUNTIME)
- public @interface MyAnnotation {
- String hello() default "ttitfly";
- String world();
- }
java 代码
- //使用自己定义的Annotation类
- public class MyTest {
- //一个方法可以有多个注解类
- @Deprecated
- @MyAnnotation(hello="china",world="earth")
- public void say(){
- System.out.println("say hello");
- }
- }
java 代码
- import java.lang.annotation.Annotation;
- import java.lang.reflect.Method;
- public class TestMain {
- //可以通过AnnotatedElement来获得到Annotation类的信息。Method,Field等都是AnnotatedElement的实现类
- public static void main(String[] args) throws Exception {
- MyTest mt = new MyTest();
- Class clazz = MyTest.class;
- //Method method = clazz.getMethod("say", null);//因为是无参数的,所以直接写个null也可以
- Method method = clazz.getMethod("say", new Class[]{});
- method.invoke(mt, new Object[]{});
- //该方法是否使用了MyAnnotation这个注解类
- boolean isExist = method.isAnnotationPresent(MyAnnotation.class) ;
- if(isExist){
- MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
- System.out.println(annotation.hello());
- System.out.println(annotation.world());
- }
- Annotation[] annotations = method.getAnnotations();
- for( Annotation annotation : annotations ){
- //打印出这样的结果:com.yahaitt.annotation.MyAnnotation
- System.out.println(annotation.annotationType().getName());
- //不能通过getClass().getName()的方式获得了。这样获得的结果类似这样的:$Proxy3,主要原因是因为Annotation在运行时刻,是通过java的动态代理实现的,
- //每次得到一个annotation,实际上并不是得到该annotation的实例,而是得到了它的一个代理,这个代理java在命名上采用的是$Proxy1,$Proxy2...的形式,数字是按照出现的顺序来定的
- //而getClass()方法返回的是该对象运行时刻所代表的真实对象,在这里也就是代理对象了
- System.out.println(annotation.getClass().getName());
- //输出结果为:java.lang.reflect.Proxy
- System.out.println(annotation.getClass().getSuperclass().getName());
- }
- }
- }
5.继承(Inherited)
在自己定义的Annotation里加入一个@Inherited ,就标识了这个定义的Annotation是可以被继承的
java 代码
- import java.lang.annotation.Inherited;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- //在自己定义的Annotation里加入一个@Inherited ,就标识了这个定义的Annotation是可以被继承的
- @Inherited
- @Retention(RetentionPolicy.RUNTIME)
- public @interface MyInherit {
- String value();
- }
java 代码
- @MyInherit("test class")
- public class Parent {
- @MyInherit("test method")
- public void doSomething(){
- System.out.println("hello");
- }
- }
java 代码
- public class Child extends Parent{
- }
java 代码
- import java.lang.reflect.Method;
- public class TestInherit {
- public static void main(String[] args) throws Exception{
- // Class< Parent > clazz = Parent.class;
- Class< Child > clazz = Child.class;
- if(clazz.isAnnotationPresent(MyInherit.class)){
- MyInherit myInherit = clazz.getAnnotation(MyInherit.class);
- System.out.println(myInherit.value());
- }
- Method method = clazz.getMethod("doSomething", new Class[]{});
- if(method.isAnnotationPresent(MyInherit.class)){
- MyInherit myInherit = method.getAnnotation(MyInherit.class);
- System.out.println(myInherit.value());
- }
- }
- }
输出结果为:
test class
test method
也就是说已经被继承了 。但是在方法上使用的Annotation也被继承了,这点有点不太明白,和文档有点冲突。
评论
2 楼
forrest_lv
2011-12-19
@Inherit指示注释类型被自动继承。如果在注释类型声明中存在 Inherited 元注释,并且用户在某一类声明中查询该注释类型,同时该类声明中没有此类型的注释,则将在该类的超类中自动查询该注释类型。此过程会重复进行,直到找到此类型的注释或到达了该类层次结构的顶层 (Object) 为止. Parent类上使用了注释@MyIherit,Parent的派生类Child将继承类上的注释@MyHerit.
注解@MyInherit用于方法Parent.doSomething()上,这个带指定注解@MyInherit的“***方法doSomething()***”是否可以被Parent的派生类Child所继承到(@MyInherit不管有没有@Inherit,带有注解@MyInherit的方法doSomething都可以被继承到),方法doSomething确实是被Child{}继承到了,自然方法上的注解是可以被得到的。
注解@MyInherit用于方法Parent.doSomething()上,这个带指定注解@MyInherit的“***方法doSomething()***”是否可以被Parent的派生类Child所继承到(@MyInherit不管有没有@Inherit,带有注解@MyInherit的方法doSomething都可以被继承到),方法doSomething确实是被Child{}继承到了,自然方法上的注解是可以被得到的。
1 楼
forrest_lv
2011-12-19
不错讲的鞭辟入里,我懂了
发表评论
-
常用小代码段和开发经验收集
2011-04-21 14:47 981工作中用到的笔记,方便查找,不断补充。 1,截取过长的文字部分 ... -
java.lang.UnsupportedClassVersionError: Bad version number in .class file
2009-08-26 12:25 3897转载:http://www.blogjava.net/hwpo ... -
java调用dll(Eclipse+CDT+MinGW)
2009-03-06 15:25 6546第一步:配置环境 需要安装CDT和MinGW. CDT:因为 ... -
servlet2.5与el表达式
2008-11-23 15:23 2668Servlet2.4版本默认支持EL,如果在MyEclipse ... -
自定义ClassLoader遇到的问题
2008-09-16 16:47 15151.自定义的类加载器 package classloa ... -
自定义标签调用资源文件
2008-05-12 22:28 1962自定义标签处理类一般都继承TagSupport或BodyTag ... -
Failed to install Tomcat6 service(Tomcat6安装失败解决方法)
2008-05-06 16:24 11709转载 :http://www.handandaily.com/ ... -
tomcat5.5日志配置
2008-05-06 16:13 2523tomcat5.5日志配置: 从Tomcat5.5后,默认设置 ... -
java List<String>集合 传递值给js的数组
2008-04-21 18:12 5329<script> var intIndex= ... -
c3p0 com.mysql.jdbc.CommunicationsException异常
2008-02-18 17:32 6237使用c3p0,偶尔会报异常: 2008-02-18 10:52 ... -
Pattern Matcher
2008-02-18 10:30 1942package test; import java. ... -
FileUpload组件上传文件
2008-01-23 03:05 6703利用FileUpload组件上传文件,需要到apache上下载 ... -
hibernate大字段处理
2008-01-21 16:45 3206hibernate大字段处理:以mysql为例 比如传张图片, ... -
一个页面嵌套一个页面
2008-01-15 10:45 3541一个页面嵌套一个页面,比如a.jsp嵌套b.jsp那么可以用 ... -
java clone
2008-01-13 18:17 59501.java里的clone分为: A:浅复制(浅克隆): 浅复 ... -
修改Eclipse注释里的${Date}变量格式
2008-01-08 15:47 82151.eclipse3.3里${date}日期格 ... -
List移除元素
2008-01-05 16:16 24771. Iterator的remove()是移除从集合里取出来的 ... -
JDom处理xml
2008-01-05 13:51 21081.DOM的缺点主要是由于DOM是一个接口定义语言(IDL), ... -
观察者模式
2008-01-03 00:45 21371观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听 ... -
DelegatingRequestProcessor
2007-12-27 11:30 3691采用DelegatingRequestProcessor将处理 ...
相关推荐
1. **Annotation定义**: Annotation的定义格式通常为`public @interface AnnotationName { attributes }`,其中`attributes`是Annotation的属性,可以包含零个或多个方法,这些方法代表了Annotation的参数。 2. *...
这里定义了一个名为`MyAnnotation`的Annotation类型,其中包含一个名为`value`的成员,其默认值为空字符串。开发者可以根据实际需求定义更多成员及其默认值。 ##### 2. 使用Annotation 在定义了Annotation之后,就...
在Java中,Annotation定义类似于接口,使用`@interface`关键字。以下是一个简单的自定义Annotation例子: ```java public @interface MyAnnotation { String value() default ""; } ``` 这里的`MyAnnotation`就是...
在Java中,Annotation定义为一种接口,可以通过反射API访问其信息。它们的使用非常灵活,可以应用于不同的程序元素,包括包、类、方法、字段、参数甚至局部变量。每个Annotation由一个名称和一个或多个成员组成,...
3. 实体类:例如,创建一个`User`类,使用Hibernate Annotation定义实体属性。`@Entity`标记表明这是一个实体类,`@Id`和`@GeneratedValue(strategy = GenerationType.AUTO)`表示`id`字段是主键,且自动生成。数据库...
通过创建的Jetty启动类运行项目,服务器会加载并解析Struts2 Annotation定义的Action,处理请求。 ### 7. 博文链接 提供的博文链接()可能包含更多详细的步骤和示例代码,建议参考以获取更具体的实现方法。 总结...
Java 5.0 中定义了 4 种标准的元注解(meta-annotation),它们被用来提供对其他注解的说明。 1. @Target @Target meta-annotation 用于说明 Annotation 所修饰的对象范围。它可以被用于 packages、types(类、...
javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用。 javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的...
7. **元Annotation**:元Annotation是用于定义其他Annotation的Annotation,例如`@Retention`定义Annotation的生命周期(编译时、类加载时或运行时),`@Target`指定Annotation可以应用到哪些程序元素,`@Documented...
要揭开SpringBoot的神秘面纱,我们从Annotation定义(@SpringBootApplication)和类定义 (SpringApplication.run)入手。 @SpringBootApplication public class Application { public static void main(String[] ...
要揭开SpringBoot的神秘面纱,我们从Annotation定义(@SpringBootApplication)和类定义 (SpringApplication.run)入手。 总结: SpringBoot的核心组件完成了基本的解析,综合来看,大部分都是Spring框架背后的一些...
#### 三、Annotation的定义与结构 - **Annotation的声明**:注解使用类似于修饰符的语法进行声明,可以应用到不同的程序元素上,如`@Override`用于方法重写标识。 - **Annotation类型**:定义注解的接口,指定了...
定义属性是指 Annotation 的成员变量,Annotation 的成员变量在 Annotation 定义中以“无形参的方法”形式来声明。分类是指根据 Annotation 是否包含成员变量,可以把 Annotation 分为标记注解和元数据 Annotation。...
我们可以重写`mapView(_:viewFor:)`方法来自定义视图: ```swift func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { guard let annotation = annotation as? Custom...
例如,可以定义一个枚举来表示性别: ```java public enum SexEnum { MAN, FEMALE } ``` 然后在Annotation中使用这个枚举: ```java public @interface PersonInfo { SexEnum sex(); } ``` 7. **使用...
- **定义Annotation类型**:类似于接口声明,但使用`@`符号。每个方法定义了一个成员,方法返回类型有限制,可以是基本类型、字符串、类、枚举、注解或它们的数组,并可以有默认值。 ```java public @interface ...
Annotation的定义类似于接口的定义,但前面需要加上`@interface`关键字。下面是一个简单的例子: ```java @Retention(RetentionPolicy.RUNTIME) // 指定注解的保留策略 @Target(ElementType.METHOD) // 指定...
Hibernate Annotation是Hibernate框架的一个扩展,它允许开发者直接在Java类和属性上使用注解(Annotations),来定义实体类与数据库表之间的映射关系。相比于XML配置,注解提供了一种更加内聚和直接的方式,使得...
在 Compass 中,Annotation 是一种元数据注解方式,它允许开发者在对象模型上直接定义搜索映射,使得对象与索引之间的关系更加清晰,简化了搜索引擎的集成工作。 一、Compass Annotation 概述 Compass Annotation ...