`

注解详解_例子

阅读更多
(1) 定义注解:

package annotations;
import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DefineAnnotation {
   public String hello() default "aaa";
   String world();
}


(2)、使用注解
package annotations;

public class UseDefineAnnotation {
  @Deprecated
  @DefineAnnotation(hello="ttitfly",world="WORLD!!!")
  public void say(){
  System.out.println("say hello");
  }
 
  /* public static void main(String[] args) {
   UseDefineAnnotation tAnnotation=new UseDefineAnnotation();
   tAnnotation.say();
}*/
}


(3)、处理器 解析注解
package annotations;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class TestDefineAnnotation {

/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
       UseDefineAnnotation useDefineAnnotation=new UseDefineAnnotation();
       //1、要解析的方法带有注解的类
       Class clazz=UseDefineAnnotation.class;
      
     //Method method = clazz.getMethod("say", null);//因为是无参数的,所以直接写个null也可以
       //2、获得带有注解的方法
       Method method=clazz.getDeclaredMethod("say", new Class[]{});
       method.invoke(useDefineAnnotation, new Class[]{}); //在实例myAnnotation上执行方法method()
     //该方法是否使用了MyAnnotation这个注解类
       boolean isExists=method.isAnnotationPresent(DefineAnnotation.class);
       if(isExists){
       //3、获得方法上的注解
       /*Annotation在运行时刻,是通过java的动态代理实现的,  
              每次得到一个annotation,实际上并不是得到该annotation的实例,
              而是得到了它的一个代理,这个代理java在命名上采用的是$Proxy1,
              $Proxy2...的形式,数字是按照出现的顺序来定的   */
       DefineAnnotation annotation=method.getAnnotation(DefineAnnotation.class);
       //4、方法注解的element方法
       System.out.println(annotation.hello()+" "+annotation.world());
       }
      
       System.out.println("-------------------");
       /************************************************/    
       Method[] methods=clazz.getDeclaredMethods();
       for(Method mt:methods){
       Annotation[] annotations=mt.getAnnotations();
       for(Annotation ant:annotations){
       System.out.println(ant.annotationType().getName());
      
    //不能通过getClass().getName()的方式获得了。这样获得的结果类似这样的:$Proxy3,主要原因是因为Annotation在运行时刻,是通过java的动态代理实现的,  
             //每次得到一个annotation,实际上并不是得到该annotation的实例,而是得到了它的一个代理,这个代理java在命名上采用的是$Proxy1,$Proxy2...的形式,数字是按照出现的顺序来定的  
             //而***getClass()方法返回的是该对象运行时刻所代表的真实对象***,在这里也就是代理对象了
          System.out.println(ant.getClass().getName());
        //输出结果为:java.lang.reflect.Proxy
          System.out.println(ant.getClass().getSuperclass().getName());
       }
       }
}

}


(4)、注解的继承性 (Inherited)
注解定义时使用了@Inherit,注解用于Type(如class)上时,Type上的注解将被Type的派生类型继承到
package annotations;
import java.lang.annotation.*;

//没有指定@Target(),则注解可用于所有的ElementType
@Inherited
@Retention(RetentionPolicy.RUNTIME)
//在自己定义的Annotation里加入一个@Inherited ,就标识了这个定义的Annotation是可以被继承的
/*指示注释类型被自动继承。如果在注释类型声明中存在 Inherited 元注释,并且用户在某一类声明中查询该注释类型,
* 同时该类声明中没有此类型的注释,则将在该类的超类中自动查询该注释类型。此过程会重复进行,直到找到此类型的注释
* 或到达了该类层次结构的顶层 (Object) 为止。如果没有超类具有该类型的注释,则查询将指示当前类没有这样的注释。

注意,如果使用注释类型注释类以外的任何事物,此元注释类型都是无效的。还要注意,此元注释仅促成从超类继承注释;对已实现接口的注释无效。
*/
public @interface MyInherit {
String value();
}

package annotations;

@MyInherit("test class")
public class Parent {
@MyInherit("test method")  
    public void doSomething(){  
        System.out.println("hello");  
    } 
}

package annotations;

public class Child extends Parent {

}

package annotations;
import java.lang.reflect.*;

public class TestInherit {

/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
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());  
        }  
}
    /*@Inherit指示注释类型被自动继承。如果在注释类型声明中存在 Inherited 元注释,并且用户在某一类声明中查询该注释类型,
     * 同时该类声明中没有此类型的注释,则将在该类的超类中自动查询该注释类型。此过程会重复进行,直到找到此类型的注释或到达了
     * 该类层次结构的顶层 (Object) 为止.   Parent类上使用了注释@MyIherit,Parent的派生类Child将继承类上的注释@MyHerit (这就是@Inherit在@MyInherit上的作用).

     注解@MyInherit用于方法Parent.doSomething()上,这个带指定注解@MyInherit的“***方法doSomething()***”
     是否可以被Parent的派生类Child所继承到(@MyInherit不管有没有@Inherit,带有注解@MyInherit的方法
     doSomething都可以被继承到),方法doSomething确实是被Child{}继承到了,自然方法上的注解是可以被得到的。*/
}
分享到:
评论

相关推荐

    04_JPA详解_第一个JPA实例与JPA主键生成策略.zip

    本压缩包文件"04_JPA详解_第一个JPA实例与JPA主键生成策略.zip"包含了关于如何在实际项目中运用JPA,以及理解JPA主键生成策略的详细教程。 ### JPA基础 1. **JPA简介**: JPA是Java EE的一部分,它提供了一套规范,...

    10_JPA详解_JPA中的一对多双向关联与级联操作.zip

    本资料包"10_JPA详解_JPA中的一对多双向关联与级联操作.zip"聚焦于JPA中的一个重要概念——一对多双向关联及其级联操作。以下是对这一主题的详细阐述。 **一对多关联** 在关系数据库设计中,一对多关联是最常见的...

    JAVA 注解示例 详解

    在Java编程语言中,注解(Annotation)是一种元数据,它提供了向编译器或JVM提供附加信息的方式。这些信息可以用于代码分析、编译时检查或运行时处理。注解不会直接影响程序的执行,但它们能为工具和框架提供重要的...

    15_传智播客JPA详解_JPA中的联合主键

    在这个例子中,`StudentCourseKey`是一个嵌入式类,它的实例作为`Enrollment`实体的主键。 在JPA中,处理联合主键需要注意以下几点: - 联合主键的类必须实现Serializable接口,因为所有主键都必须是可序列化的。 ...

    12_JPA详解_JPA中的一对一双向关联.zip

    在这个例子中,`@JoinColumn`注解用于指定外键列名,而`mappedBy`属性指定了导航字段。这样,我们就可以在`Student`对象中通过`teacher`属性访问对应的`Teacher`对象,反之亦然。 双向关联的管理需要特别注意的是,...

    JPA注解详解

    **JPA注解详解** Java Persistence API(JPA)是一种Java平台上的标准,用于管理和持久化对象关系映射(ORM)。在JPA中,注解是声明性编程的一部分,允许开发者在实体类上直接定义数据存储相关的元数据,简化数据库...

    Spring MVC 使用注解的示例讲解

    这个例子中,"/users"请求会被UserController的getUsers方法处理,返回的"users"是视图名,通常对应一个HTML页面。 3. **方法参数绑定** Spring MVC支持使用注解直接将请求参数绑定到方法参数上,如@RequestParam...

    12_传智播客JPA详解_JPA中的一对一双向关联

    这种关联关系在现实世界的例子中很常见,例如一个员工和其部门,一个学生和他的班主任等。在JPA中实现一对一双向关联需要在两个实体类中分别定义关系。 首先,我们来看如何在实体类中定义一对一的关联。假设我们有`...

    14_传智播客JPA详解_JPA中的多对多双向关联的各项关系操作

    在学生和课程的例子中,学生实体类有一个课程集合,而课程实体类也有一个学生集合。这样,我们既可以从学生的角度查看他们所选的课程,也可以从课程的角度查看选修这门课的学生。 以下是一些关键知识点: 1. **...

    08_JPA详解_分析JPA与持久化实现产品对接的源代码.zip

    源代码可能会包含JPQL的例子。 3. **事务管理**: JPA支持声明式事务管理,可以在方法级别或类级别上配置事务。 4. **DAO层和Service层**:通常会看到如何在数据访问对象(DAO)和业务服务层中使用`EntityManager`...

    SpringMvc注解详解

    【SpringMvc注解详解】 SpringMvc 是 Spring 框架的一部分,主要负责处理 Web 请求。在 SpringMVC 中,注解扮演着至关重要的角色,它们简化了代码并减少了配置。以下是一些常用的 SpringMVC 注解及其详细解释: 1....

    Servlet注解详解.docx

    在这个例子中,`@WebServlet`注解包含了以下几个关键参数: 1. `name`: 对应于`&lt;servlet-name&gt;`,用于唯一标识Servlet。 2. `urlPatterns`: 对应于`&lt;url-pattern&gt;`,定义了Servlet所对应的URL路径,可以是字符串数组...

    Hibernate注解详解(超全面不解释)

    ### Hibernate注解详解 #### 实体Bean的概念及声明方式 在Hibernate框架中,持久化的Java对象被称为实体Bean。每一个持久化的POJO(Plain Old Java Object)类都可以视为一个实体Bean,通过`@Entity`注解来进行...

    springmvc注解详解

    SpringMVC 注解详解 SpringMVC 是一个基于Java的Web应用程序框架,使用了Model-View-Controller(MVC)模式来分离应用程序的逻辑。SpringMVC提供了许多注解来简化配置和开发过程。下面将详细介绍SpringMVC的注解。 ...

    hibernate注解详解

    ### Hibernate注解详解 #### 实体Bean的概念与创建 Hibernate框架是Java开发中非常重要的对象关系映射(ORM)工具之一,它简化了数据库操作,让开发者能够更加专注于业务逻辑而不是繁琐的SQL语句编写。在Hibernate...

    spring aop 注解例子

    **Spring AOP 注解例子详解** 在 Spring 框架中,面向切面编程(Aspect Oriented Programming,AOP)是一种强大的设计模式,它允许我们分离关注点,将业务逻辑与系统服务(如日志、事务管理等)解耦。在 Spring AOP...

    S2SH全注解例子

    **S2SH全注解例子详解** S2SH(Struts2+Spring+Hibernate)是一个经典的Java Web开发框架组合,用于构建高效、可扩展的企业级应用程序。在这个全注解的例子中,我们将深入探讨如何利用注解来简化S2SH框架的配置和...

    Retrofit 2.0使用详解的例子

    在这个例子中,`@GET`注解表示这是一个GET请求,URL路径中的`{id}`将被替换为实际参数。`Call&lt;User&gt;`是Retrofit的返回类型,它表示一个异步的网络请求,可以用于执行和监听请求状态。 接下来,你需要配置Retrofit...

    SpringMVC注解开发的详解.doc

    在这个例子中,`@Controller`定义了`ProductController`是一个控制器,`@RequestMapping("/products")`表示所有该类的方法都会处理以"/products"开头的URL。`@GetMapping("/{id}")`则指定了一个处理GET请求的方法,...

    Spring整合Restful详解+例子+建表语句

    标题"Spring整合Restful详解+例子+建表语句"暗示了我们将探讨如何将Spring框架与RESTful服务相结合,通过实际的项目例子来深入理解这一过程,并提供相关的数据库建表语句。 首先,Spring MVC是Spring框架的一部分,...

Global site tag (gtag.js) - Google Analytics