- 浏览: 107124 次
- 性别:
- 来自: 南京
-
文章分类
最新评论
-
newzhq:
经常写博客是个好习惯,向你学习。
javascript深入理解js闭包 -
Action-人生:
newzhq 写道闭包其实跟js的语言结构有关系。为什么会出现 ...
javascript深入理解js闭包 -
Action-人生:
小_情兽_ 写道[color=blue][/color]摸不着 ...
$.extend(),与$.fn.extend() 讲解(一) -
Action-人生:
先生葛 写道文中有错 别误人子弟啊[color=red][ ...
$.extend(),与$.fn.extend() 讲解(一) -
小_情兽_:
[color=blue][/color]摸不着头脑 楼上说的 ...
$.extend(),与$.fn.extend() 讲解(一)
//来自于别人
一、什么是java注解
注解,顾名思义,注解,就是对某一事物进行添加注释说明,会存放一些信息,这些信息可能对以后某个时段来说是很有用处的。
Java注解又叫java标注,java提供了一套机制,使得我们可以对方法、类、参数、包、域以及变量等添加标准(即附上某些信息)。且在以后某个时段通过反射将标注的信息提取出来以供使用。
二、自定义Java标注
1 为什么要自定义注解
Java从1.5版本以后默认内置三个标注:
Ø @Override:只能用在方法之上的,用来告诉别人这一个方法是改写父类的。
Ø @Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上.
Ø @SuppressWarnings:这一个类型可以来暂时把一些警告信息消息关闭.
但是,仅仅这三个标注是不能满足我们开发时一些需求的。所以java允许我们自定义注解来使用。
2 如何自定义注解
自定义步骤大致分为两步:
1, 通过@interface关键字(注意,不是interface,是@interace)声明注解名称,以及注解的成员属性或者叫做注解的参数。
2, 使用java内置的四个元注解对这个自定义标注的功能和范围进行一些限制
问题来了,什么是元注解?
3 什么是元注解
元注解,就是定义注解的注解,也就是说这些元注解是的作用就是专门用来约束其它注解的注解。请区别上面那三个注解,他们也是通过元注解定义而来的。
元注解有哪些呢,主要有四个@Target,@Retention,@Documented,@Inherited?
1. * 元注解有:@Target,@Retention,@Documented,@Inherited
2. *
3. * @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括:
4. * ElemenetType.CONSTRUCTOR 构造器声明
5. * ElemenetType.FIELD 域声明(包括 enum 实例)
6. * ElemenetType.LOCAL_VARIABLE 局部变量声明
7. * ElemenetType.METHOD 方法声明
8. * ElemenetType.PACKAGE 包声明
9. * ElemenetType.PARAMETER 参数声明
10. * ElemenetType.TYPE 类,接口(包括注解类型)或enum声明
11. *
12. * @Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括:
13. * RetentionPolicy.SOURCE 注解将被编译器丢弃
14. * RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃
15. * RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
16. *
17. * @Documented 将此注解包含在 javadoc 中
18. *
19. * @Inherited 允许子类继承父类中的注解
4 自定义及使用注解示例
自定义一个类级别的标注Description
package lighter.javaeye.com;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)//这个标注应用于类
@Retention(RetentionPolicy.RUNTIME)//标注会一直保留到运行时
@Documented//将此注解包含在javadoc中
public @interface Description {
String value();
}
再定义个方法级别的注解Name
package lighter.javaeye.com;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//注意这里的@Target与@Description里的不同,参数成员也不同
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Name {
String originate();
String community();
}
然后使用以上两个注解
package lighter.javaeye.com;
@Description(value="javaeye,做最棒的软件开发交流社区")
public class JavaEyer {
@Name(originate="创始人:robbin",community="javaEye")
public String getName()
{
return null;
}
@Name(originate="创始人:江南白衣",community="springside")
public String getName2()
{
return "借用两位的id一用,写这一个例子,请见谅!";
}
}
说明:其中标注“@Description(value="javaeye,做最棒的软件开发交流社区")”,可以写成“@Description("javaeye,做最棒的软件开发交流社区") ”,结果也是一样的。因为Description标注定义的时候其参数(或者说属性)为value。而value比较特殊,它在被指定参数的时候可以不用显示的写出来。当然如果定义的时候参数名不是value而是其它的比如des,那么使用注解的时候,必须显示写出参数名,然后再赋值:@Description(Des=”xxx”)
提取出注解的信息
package lighter.javaeye.com;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
public class TestAnnotation {
/**
* author lighter
* 说明:具体关天Annotation的API的用法请参见javaDoc文档
*/
public static void main(String[] args) throws Exception {
String CLASS_NAME = "lighter.javaeye.com.JavaEyer";
Class test = Class.forName(CLASS_NAME);
Method[] method = test.getMethods();
boolean flag = test.isAnnotationPresent(Description.class);
if(flag)
{
Description des = (Description)test.getAnnotation(Description.class);
System.out.println("描述:"+des.value());
System.out.println("-----------------");
}
//把JavaEyer这一类有利用到@Name的全部方法保存到Set中去
Set<Method> set = new HashSet<Method>();
for(int i=0;i<method.length;i++)
{
boolean otherFlag = method[i].isAnnotationPresent(Name.class);
if(otherFlag) set.add(method[i]);
}
for(Method m: set)
{
Name name = m.getAnnotation(Name.class);
System.out.println(name.originate());
System.out.println("创建的社区:"+name.community());
}
}
}
注意事项:
所有的Annotation会自动继承java.lang.annotation这一个接口,所以不能再去继承别的类或是接口.
最重要的一点,Annotation类型里面的参数该怎么设定:
第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型.
第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String
一、什么是java注解
注解,顾名思义,注解,就是对某一事物进行添加注释说明,会存放一些信息,这些信息可能对以后某个时段来说是很有用处的。
Java注解又叫java标注,java提供了一套机制,使得我们可以对方法、类、参数、包、域以及变量等添加标准(即附上某些信息)。且在以后某个时段通过反射将标注的信息提取出来以供使用。
二、自定义Java标注
1 为什么要自定义注解
Java从1.5版本以后默认内置三个标注:
Ø @Override:只能用在方法之上的,用来告诉别人这一个方法是改写父类的。
Ø @Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上.
Ø @SuppressWarnings:这一个类型可以来暂时把一些警告信息消息关闭.
但是,仅仅这三个标注是不能满足我们开发时一些需求的。所以java允许我们自定义注解来使用。
2 如何自定义注解
自定义步骤大致分为两步:
1, 通过@interface关键字(注意,不是interface,是@interace)声明注解名称,以及注解的成员属性或者叫做注解的参数。
2, 使用java内置的四个元注解对这个自定义标注的功能和范围进行一些限制
问题来了,什么是元注解?
3 什么是元注解
元注解,就是定义注解的注解,也就是说这些元注解是的作用就是专门用来约束其它注解的注解。请区别上面那三个注解,他们也是通过元注解定义而来的。
元注解有哪些呢,主要有四个@Target,@Retention,@Documented,@Inherited?
1. * 元注解有:@Target,@Retention,@Documented,@Inherited
2. *
3. * @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括:
4. * ElemenetType.CONSTRUCTOR 构造器声明
5. * ElemenetType.FIELD 域声明(包括 enum 实例)
6. * ElemenetType.LOCAL_VARIABLE 局部变量声明
7. * ElemenetType.METHOD 方法声明
8. * ElemenetType.PACKAGE 包声明
9. * ElemenetType.PARAMETER 参数声明
10. * ElemenetType.TYPE 类,接口(包括注解类型)或enum声明
11. *
12. * @Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括:
13. * RetentionPolicy.SOURCE 注解将被编译器丢弃
14. * RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃
15. * RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
16. *
17. * @Documented 将此注解包含在 javadoc 中
18. *
19. * @Inherited 允许子类继承父类中的注解
4 自定义及使用注解示例
自定义一个类级别的标注Description
package lighter.javaeye.com;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)//这个标注应用于类
@Retention(RetentionPolicy.RUNTIME)//标注会一直保留到运行时
@Documented//将此注解包含在javadoc中
public @interface Description {
String value();
}
再定义个方法级别的注解Name
package lighter.javaeye.com;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//注意这里的@Target与@Description里的不同,参数成员也不同
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Name {
String originate();
String community();
}
然后使用以上两个注解
package lighter.javaeye.com;
@Description(value="javaeye,做最棒的软件开发交流社区")
public class JavaEyer {
@Name(originate="创始人:robbin",community="javaEye")
public String getName()
{
return null;
}
@Name(originate="创始人:江南白衣",community="springside")
public String getName2()
{
return "借用两位的id一用,写这一个例子,请见谅!";
}
}
说明:其中标注“@Description(value="javaeye,做最棒的软件开发交流社区")”,可以写成“@Description("javaeye,做最棒的软件开发交流社区") ”,结果也是一样的。因为Description标注定义的时候其参数(或者说属性)为value。而value比较特殊,它在被指定参数的时候可以不用显示的写出来。当然如果定义的时候参数名不是value而是其它的比如des,那么使用注解的时候,必须显示写出参数名,然后再赋值:@Description(Des=”xxx”)
提取出注解的信息
package lighter.javaeye.com;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
public class TestAnnotation {
/**
* author lighter
* 说明:具体关天Annotation的API的用法请参见javaDoc文档
*/
public static void main(String[] args) throws Exception {
String CLASS_NAME = "lighter.javaeye.com.JavaEyer";
Class test = Class.forName(CLASS_NAME);
Method[] method = test.getMethods();
boolean flag = test.isAnnotationPresent(Description.class);
if(flag)
{
Description des = (Description)test.getAnnotation(Description.class);
System.out.println("描述:"+des.value());
System.out.println("-----------------");
}
//把JavaEyer这一类有利用到@Name的全部方法保存到Set中去
Set<Method> set = new HashSet<Method>();
for(int i=0;i<method.length;i++)
{
boolean otherFlag = method[i].isAnnotationPresent(Name.class);
if(otherFlag) set.add(method[i]);
}
for(Method m: set)
{
Name name = m.getAnnotation(Name.class);
System.out.println(name.originate());
System.out.println("创建的社区:"+name.community());
}
}
}
注意事项:
所有的Annotation会自动继承java.lang.annotation这一个接口,所以不能再去继承别的类或是接口.
最重要的一点,Annotation类型里面的参数该怎么设定:
第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型.
第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String
发表评论
-
JAVA方法可变参数
2019-04-23 16:53 440参考来自于别人, ---定义可变参数方法--- publ ... -
java编译和类加载详述
2019-04-19 10:54 654来源于https://blog.csdn.net/ ... -
JDK动态代理
2019-04-18 14:48 0JDK动态代理几个基本常识点 ClassLoader, Cla ... -
链接地址
2018-05-28 16:26 0http://www.cnblogs.com/linjiqin ... -
static final long serialversionuid解释
2017-03-06 09:47 683serialVersionUID 用来表明类的不同版本间的兼容 ... -
Web项目中 .classpath、.mymetadata、.project文件的作用
2017-02-28 14:00 644http://blog.csdn.net/u010466666 ... -
用cxf生成webservice的java客户端代码
2017-02-16 10:20 692http://www.cnblogs.com/hf8051/p ... -
java项目打成jar包
2017-02-15 19:47 1050来自于http://www.cnblogs.com/tiang ... -
ResultSet相关ResultSetMetaData详细
2015-04-17 13:34 620http://www.cnblogs.com/chinafin ... -
Log4j的日志的使用
2015-02-26 09:28 484http://blog.csdn.net/wuhailin20 ... -
X-Forwarded-For 和 X-Real-IP 的区别?
2015-01-19 11:24 1288X-Forwarded-For 和 X-Rea ... -
微信公众平台开发
2015-01-04 15:03 585http://blog.csdn.net/lyq8479/ar ... -
关于多线程的几个问题(面试小问题,Java篇)
2015-01-04 10:08 553面试官想考考我多线程 ... -
精)JAVA线程池原理以及几种线程池类型介绍
2014-12-24 22:24 559http://blog.csdn.net/it_man/art ... -
JUnit Assert方法总结
2014-09-24 10:36 697JUnit Assert方法总结 junit中的assert方 ... -
java 参数后面的三个点表示什么意思
2014-08-08 10:24 1097java 参数后面的三个点表示什么意思 2013-06- ... -
log4j基本的properties配置
2014-05-19 14:37 851log4j基本的properties配置 #to conlos ... -
日志输出概述
2014-05-19 10:18 749[size=xx-large][size=medium]log ... -
别人的百度网盘
2013-11-19 15:53 840http://pan.baidu.com/share/home ... -
struts2文件下载
2013-10-20 15:55 1127Struts2文件下载 目录: struts.xm ...
相关推荐
Java注解是Java编程语言中的一个重要特性,它提供了一种元数据的方式,允许程序员在代码中插入额外的信息,这些信息可以被编译器或者运行时环境用来执行特定的任务。注解在现代Java开发中扮演了不可或缺的角色,尤其...
在本视频教程中,我们将深入探讨Java注解的各个方面,包括其基本概念、使用方式以及在实际开发中的应用。 首先,我们来理解什么是Java注解。注解在Java中是一种特殊的声明,它的主要目的是提供元数据,即关于代码的...
首先,我们需要理解Java注解的基本原理。注解是一种元数据,它提供了一种安全的方法来将信息附加到代码中,而不直接影响代码的执行。Java提供了内置的注解,如`@Override`、`@Deprecated`等,但自定义注解允许我们...
Java注解是Java编程语言中的一个重要特性,它们提供了一种元数据的方式,让开发者能够向编译器或运行时环境传递额外的信息。...对于新手来说,掌握Java注解的基本概念和常见用法是非常重要的一步。
以上就是关于Java注解的基本概念、使用和自定义方法。在实际开发中,注解广泛应用于Spring框架、ORM框架如Hibernate等,极大地简化了代码,提高了可维护性和可扩展性。学习和掌握注解是提升Java编程技能的重要一环。
本篇文章将深入探讨Java注解的使用,包括其基本概念、类型、使用场景以及如何自定义注解。 首先,Java提供了三种预定义的注解类型,它们是: 1. `@Override`:确保方法真正重写了超类中的方法,如果找不到匹配的...
本文将深入探讨Java注解的API及其使用。 1. **注解的基本概念** - 注解(Annotation)是Java SE 5.0引入的新特性,它是一种用于向编译器或JVM提供元数据的方式。 - 注解通过`@`符号后跟注解类型的名称来应用,如`...
本文将深入探讨如何在Spring框架中利用Java注解进行扩展,以提升代码的可读性和可维护性。 首先,我们需要了解Java注解(Annotation)。注解是Java语言的一种元数据,它提供了在编译时或运行时对代码进行信息附加的...
在本教程中,我们将深入探讨如何使用Spring 4框架,特别是其基于Java注解的配置方式,来构建一个高效、可维护的系统。Spring 4是Java企业级应用开发的首选框架,它提供了广泛的功能,包括依赖注入、AOP(面向切面...
本文将深入探讨Java注解的概念、用途、定义及应用实例。 #### 注解的基本概念 注解本质上是一种特殊的语法,用于在代码中嵌入元数据。这些元数据可以是关于代码的任何信息,如作者、版本、测试状态等,也可以是更...
Java注解、反射、字节码和类加载机制是Java编程中的核心概念,它们在实际开发中扮演着重要角色。让我们深入探讨这些知识点。 **Java注解(Annotation)**: Java注解是一种元数据,它提供了在编译时或运行时处理代码的...
Java Annotation注解技术是自Java SE 5.0版本引入的一种元编程机制,它允许程序员在源代码的各个层面(如类、方法、变量等)添加元数据,以供编译器、JVM或第三方工具在编译时或运行时进行处理。Annotation简化了...
### Java注解详解 #### 一、注解(Annotation)简介 注解是Java语言自JDK 5.0版本引入...以上内容总结了Java注解的基本概念、常见注解、元注解以及注解的定义和使用方式,帮助开发者更好地理解和运用注解这一强大特性。
在Java编程中,注解(Annotation)是一种元数据,它提供了在代码中插入信息的方式,这些信息可以被编译器或运行时环境...通过实践这个例子,你可以更好地理解和掌握这些概念,从而在实际项目中更有效地利用注解和反射。
"Java 注解详解" Java 注解是 Java 中最重要却最容易被人遗忘的知识点。很多人不明白它是怎么起作用的,甚至有人把它和注释混淆。...通过本文的介绍,我们可以更好地理解 Java 注解的概念和使用方法。
在本文中,我们将详细介绍 Java 自定义注解的概念、特点、实现方式及实践应用。 概念 ---- Java 自定义注解是 Java 语言中的一项新特性,始于 JDK 5。它可以使开发者自定义注解,以满足不同的需求。注解可以看作是...
首先,我们来看注解(Annotation)的概念。在Java中,注解是一种元数据,它可以提供有关代码的附加信息,但不直接影响代码的执行。注解通常用于编译器、构建工具或者运行时环境,以便进行代码分析、编译时检查或运行...
在编程世界中,Java注解(Annotation)是一个强大的工具,它允许程序员在代码中嵌入元数据,这些元数据不直接影响程序的运行,但可以被编译器或运行时环境用来进行各种处理。Android开发中,注解同样扮演着重要角色...
Java自定义注解和通过反射获取注解是Java编程中重要的高级特性,它们极大地增强了代码的可读性和可维护性。注解(Annotation)是一种元数据,提供了在编译时和运行时对代码进行标记的方法,而反射(Reflection)则是...