一、注解

  1.所有的注解都是类。

  2.所有的注解都是Annotation接口的子类。

接口摘要

Annotation

所有 annotation 类型都要扩展的公共接口。

  3.定义方式

public @interface TestAnnotation {

}

  4.可以注解的位置:任何地方都可以,但是要满足注解的具体限制,默认注解可以加在任意位置上

package com.kdyzm.anotation;

@TestAnnotation
public class Test {
@TestAnnotation
private String name; @TestAnnotation
public void show(@TestAnnotation String name)
{
@TestAnnotation
String age;
System.out.println(name);
}
}

  5.使用注解限制注解的位置

  使用@Target注解限制自定义注解的注解位置。

@Target(value={ElementType.METHOD})//声明只能对方法进行注解,接收数组参数

  具体可以限制的类型:ElementType枚举

/*
* %W% %E%
*
* Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/ package java.lang.annotation; /**
* A program element type. The constants of this enumerated type
* provide a simple classification of the declared elements in a
* Java program.
*
* <p>These constants are used with the {@link Target} meta-annotation type
* to specify where it is legal to use an annotation type.
*
* @author Joshua Bloch
* @since 1.5
*/
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
TYPE, /** Field declaration (includes enum constants) */
FIELD, /** Method declaration */
METHOD, /** Parameter declaration */
PARAMETER, /** Constructor declaration */
CONSTRUCTOR, /** Local variable declaration */
LOCAL_VARIABLE, /** Annotation type declaration */
ANNOTATION_TYPE, /** Package declaration */
PACKAGE
}

ElementType.java

  6.限制注解在运行时是否删除

  使用@Retention限制注解的存在范围

@Retention(value=RetentionPolicy.RUNTIME)//声明该注解在运行时保存,即使用方法isAnnotationPresent方法返回值是true

  具体的参数见:RetentionPolicy枚举(保留策略枚举)。

/*
* %W% %E%
*
* Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/ package java.lang.annotation; /**
* Annotation retention policy. The constants of this enumerated type
* describe the various policies for retaining annotations. They are used
* in conjunction with the {@link Retention} meta-annotation type to specify
* how long annotations are to be retained.
*
* @author Joshua Bloch
* @since 1.5
*/
public enum RetentionPolicy {
/**
* Annotations are to be discarded by the compiler.
*/
SOURCE, /**
* Annotations are to be recorded in the class file by the compiler
* but need not be retained by the VM at run time. This is the default
* behavior.
*/
CLASS, /**
* Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
*
* @see java.lang.reflect.AnnotatedElement
*/
RUNTIME
}

RetentionPolicy.java

  7.注解的作用

    (1)编译时限制作用

public class MyServlet extends HttpServlet {
@Override
public void doGet(ServletRequest req,String name)
throws ServletException, IOException {
}
}

    因为父类没有这个方法,所以加上@Override注解之后就会编译报错。

    (2)运行时反射

    所有类的字节码对象Class、Field、Method、Constructor都拥有一个方法

 该方法用于判断类上、字段上、方法上、构造方法上是否存在注解,如果存在则返回true,否则返回false

 boolean

isAnnotation()
          如果此 Class 对象表示一个注释类型则返回 true。

    默认自定义注解在运行时删除,但是通过其它注解可以定义该自定义注解的生存范围。怎样定义见6。

  8.注解的实例化

    永远不要实例化注解类,因为注解类是通过系统通过反射实例化的。

  9.给注解定义属性/方法(官方说法为属性)。

    (1)value属性:官方推荐的属性,也是默认的属性,使用方法:public String value();(这种定义方法看上去好像是方法,但是实际上是属性,暂且为属性)

    (2)修饰符必须是public,可以存在static、final修饰,但是不能有其它修饰符。

    (3)默认值:使用关键字default定义,如果没有设置默认值,则在使用注解的时候必须显示赋值才能通过编译。

  10.注解定义示例。

package com.kdyzm.anotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(value={ElementType.METHOD})//声明只能对方法进行注解,接收数组参数
@Retention(value=RetentionPolicy.RUNTIME)//声明该注解在运行时保存,即使用方法isAnnotationPresent方法返回值是true
public @interface MyAnnotation {
public String value();
public String name() default "noName";
}

二、使用注解小示例。

  1.获取注解的属性值。

  使用Class类、Field类、Method类、Constructor类的getAnnotation方法。  

 

<A extends Annotation>
A

getAnnotation(Class<A> annotationClass)
          如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。

  2.自定义注解小练习。

    (1)自定义注解MyAnnotation

package com.kdyzm.anotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(value={ElementType.METHOD})//声明只能对方法进行注解,接收数组参数
@Retention(value=RetentionPolicy.RUNTIME)//声明该注解在运行时保存,即使用方法isAnnotationPresent方法返回值是true
public @interface MyAnnotation {
public String value();
public String name() default "noName";
}

    (2)在UseMyAnnotation类中使用自定义注解

package com.kdyzm.setOnMyAnnotation;

import com.kdyzm.anotation.MyAnnotation;
//使用自定义注解,该注解只能加在方法上。
public class UseMyAnnotation {
private String name;
private int age;
@MyAnnotation("setName方法")
public void setName(String name)
{
this.name=name;
}
@MyAnnotation("getName方法")
private String getName()
{
return name;
}
private int getAge()
{
return age;
}
@MyAnnotation("setAge方法")
public void setAge(int age)
{
this.age=age;
}
}

    (3)解析UseMyAnnotation类的所有内容并对注解进行解析。

package com.kdyzm.demo;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import com.kdyzm.anotation.MyAnnotation; //测试自定义注解MyAnnotation的使用,使用MyAnnotation类和UseMyAnnotation类两个类
public class MyTest {
public static void main(String[] args) throws Exception {
String className="com.kdyzm.setOnMyAnnotation.UseMyAnnotation";
Class cls=Class.forName(className);
//实例化该类。
Object obj=cls.newInstance(); //获取该类中的所有方法
Method []methods=cls.getDeclaredMethods();
//遍历该方法数组。
for(Method method:methods)
{
boolean flag=method.isAnnotationPresent(MyAnnotation.class);//判断是否进行了方法的注解
if(flag)//如果进行了方法的注解
{
System.out.print("被注解的方法:");
//判断是否是私有的方法
if(method.getModifiers()==Modifier.PRIVATE)
{
//如果是私有的方法则设置暴力破解
method.setAccessible(true);
System.out.println("该方法私有!方法名为:"+method.getName());
}
else
{
System.out.println("该方法共有!方法名为:"+method.getName());
} //如果被注解了,输出该注解属性值
MyAnnotation annotation=method.getAnnotation(MyAnnotation.class);
String value=annotation.value();
String name=annotation.name();
System.out.println("该注解的内容是:"+value+","+name);
}
else//说明是没有被注解的方法
{
System.out.print("没有被注解的方法:");
//判断是否是私有的方法
if(method.getModifiers()==Modifier.PRIVATE)
{
//如果是私有的方法则设置暴力破解
method.setAccessible(true);
System.out.println("该方法私有!方法名为:"+method.getName());
}
else
{
System.out.println("该方法共有!方法名为:"+method.getName());
}
}
System.out.println();
}
}
}

    (4)运行结果。

没有被注解的方法:该方法私有!方法名为:getAge

被注解的方法:该方法共有!方法名为:setAge
该注解的内容是:setAge方法,noName 被注解的方法:该方法私有!方法名为:getName
该注解的内容是:getName方法,noName 被注解的方法:该方法共有!方法名为:setName
该注解的内容是:setName方法,noName

【Java EE 学习 24 上】【注解详解】的更多相关文章

  1. 【Java EE 学习 74 上】【数据采集系统第六天】【使用Jfreechart的统计图实现】【Jfreechart的基本使用方法】

    之前已经实现了数据的采集,现在已经有了基本的数据,下一步就需要使用这些数据实现统计图的绘制了.这里使用Jfreechart实现这些统计图的绘制.首先看一下Jfreechart的基本用法,只有知道了它的 ...

  2. 【Java EE 学习 80 上】【WebService】

    一.WebService概述 什么是WebService,顾名思义,就是基于Web的服务,它使用Http方式接收和响应外部系统的某种请求,从而实现远程调用.WebService实际上就是依据某些标准, ...

  3. 【Java EE 学习 78 上】【数据采集系统第十天】【Service使用Spring缓存模块】

    一.需求分析 调查问卷中或许每一个单击动作都会引发大量的数据库访问,特别是在参与调查的过程中,只是单击“上一页”或者“下一页”的按钮就会引发大量的查询,必须对这种问题进行优化才行.使用缓存策略进行查询 ...

  4. 【Java EE 学习 25 上】【网上图书商城项目实战】

    一.概述 1.使用的jdk版本:1.6 2.java EE版本:1.6 3.指导老师:传智播客 王建 二.小项目已经实现的功能 普通用户: 1.登陆 2.注册 3.购物 4.浏览 管理员用户(全部管理 ...

  5. 【Java EE 学习 24 下】【注解在数据库开发中的使用】【反射+注解+动态代理在事务中的应用service层】

    一.使用注解可以解决JavaBean和数据库中表名不一致.字段名不一致.字段数量不一致的问题. 1.Sun公司给jdbc提供的注解 @Table.@Column.@Id.@OneToMany.@One ...

  6. 【Java EE 学习 83 上】【SpringMVC】【基本使用方法】

    一.SpringMVC框架概述 什么是SpringMVC?SpringMVC是一个和Struts2差不多的东西,他们的作用和性质几乎是相同的,甚至开发效率上也差不多,但是在运行效率上SpringMVC ...

  7. 【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】

    OA项目中有极大可能性使用到JBPM框架解决流程控制问题,比如请假流程.报销流程等等. JBPM:JBoss Business Process Management,翻译过来就是业务流程管理.实际上就 ...

  8. 【Java EE 学习 82 上】【MAVEN基本安装和使用方法】

    一.Maven概述 1.什么是Maven? Maven中文意思是"行家"."专家",它是一种跨平台的项目管理工具. 2.Maven有什么作用? Maven能够实 ...

  9. 【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】

    一.需求分析 日志数据在很多行业中都是非常敏感的数据,它们不能删除只能保存和查看,这样日志表就会越来越大,我们不可能永远让它无限制的增长下去,必须采取一种手段将数据分散开来.假设现在整个数据库需要保存 ...

随机推荐

  1. 篇一:js中动态加载---append

    之前是一行代码,不能动态加载,新的需求要动态加载,使用append $('#Order_information').append(' <div class="single_produc ...

  2. java-map和object装换

    /** * 使用org.apache.commons.beanutils进行转换 */ class A { public static Object mapToObject(Map<String ...

  3. Python操作Mysql之基本操作

    pymysql python操作mysql依赖pymysql这个模块 下载安装 pip3 install pymysql 操作mysql python操作mysql的时候,是通过”游标”来进行操作的. ...

  4. 七牛图片上传JSSDK

    BASE64图片上传 接口说明: POST /putb64/<Fsize>/key/<EncodedKey>/mimeType/<EncodedMimeType>/ ...

  5. Codeforces 2016 ACM Amman Collegiate Programming Contest A. Coins(动态规划/01背包变形)

    传送门 Description Hasan and Bahosain want to buy a new video game, they want to share the expenses. Ha ...

  6. 硕士研究生入学考试复试试卷答案.tex

    %该模板用于数学答题 \documentclass[UTF8]{ctexart}%[中文编码 UTF8] \usepackage{fancyhdr}%{页眉页脚页码} \pagestyle{fancy ...

  7. Java Persistence with Hibernate

    我们在Java中谈到持久化时,一般是指利用SQL在关系数据库中存储数据. ORM映射元数据,JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系, 框架据此将实体对象 ...

  8. [译]使用branch

    这篇文章将介绍Git分支. 首先, 看看如果创建分支, 这就像是request一个新的项目历史. 接着, 来看看git checkout是如果能被用来选择一个分支的. 最后, 学习用git merge ...

  9. MySQL 视图

    一.视图是一种虚拟存在的表,并不在数据库中实际存在.数据来自于视频中查询使用的表,在使用视图时动态生成的. 二.视图的优势: (A) 简单:已经是过滤好的复合条件的结果集 (B) 安全:表的权限不能限 ...

  10. 多重网格法简介(Multi Grid)

    原文链接 多重网格法是一种用于求解方程组的方法,可用于插值.解微分方程等. 从专业角度讲多重网格法实际上是一种多分辨率的算法,由于直接在高分辨率(用于求解的间隔小)上进行求解时对于低频部分收敛较慢,与 ...