【JAVA基础篇】注解

一、什么是注解?

注解是元数据,所谓元数据就是描述数据的数据。

在annotation诞生之前(jdk1.5诞生了注解),甚至之后,xml被广泛的由于描述元数据。但是后来,有一些应用开发工程师和架构师觉得它越来越难以维护了,他们觉得需要一种和代码紧耦合的东西,而不是xml配置和代码是松耦合的(某些情况下甚至是完全分离的),于是annotation诞生了。

假如你想为应用设置很多的常量或参数,这种情况下,XML是一个很好的选择,因为它不会同特定的代码相连。如果你想把某个方法声明为服务,那么使用Annotation会更好一些,因为这种情况下需要注解和方法紧密耦合起来,开发人员也必须认识到这点。

目前,许多框架将XML和Annotation两种方式结合使用,平衡两者之间的利弊。

二、使用注解的好处

  1. 对代码进行标记
  2. 生成文档
  3. 编译时进行语法检查
  4. 减少XML配置

三、注解的分类

3.1、元注解

用来定义注解的注解,@interface、@Target、@Retention、@Inherited

注解作用
@interface定义注解
@Target声明注解的使用目标,说明这个可以在类型上使用,还是属性、还是方法、还是参数
@Retention注解应该如何去保留,是在源码中保留,还是在字节码文件中保留,还是在运行时保留
@Inherited子类是否继承父类在类上定义的注解

3.2、内置注解

jdk定义的一些注解,还有很多其他的,这里只列举一部分:@SuppressWarnings、@Deprecated、@Override、@Documented、@FunctionaInterface、@SafeVarargs、@version、@author、@param、@exception、@return

@SuppressWarnings忽略警告
@Deprecated弃用
@Override说明此方法重写父类的方法
@Documented生成javadoc,生成javadoc时默认是不生成注解说明的,但是如果使用了@Documented来定义这个注解,那么将会生成注解说明

3.3、自定义注解

使用@interface来自定义一个注解

四、注解使用示例

我们先来定义几个注解

4.1、注解定义

package org.cc.annotation;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)
public @interface Controller {String value();
}
package org.cc.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Inject {String value();
}
package org.cc.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Inherited
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Parameter {String value() default "";
}
package org.cc.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Inherited
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Permission {String value() default "root";
}
package org.cc.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Required {
}

4.2、使用注解

package org.cc.annotation.use;import org.cc.annotation.Controller;
import org.cc.annotation.Inject;
import org.cc.annotation.Parameter;
import org.cc.annotation.Permission;
import org.cc.annotation.Required;
/*** 定义一个类,来使用刚刚定义的注解* @author cc**/
@Controller("testController")
public class TestController {@Inject("injectStr")private String injectStr;@Permission("testPermission")public void test(@Parameter("param") @Required String param,String param2){}
}
package org.cc.annotation.use;/*** TestController类的子类* @author cc**/
public class SubTestController extends TestController{private String injectStr;public void test(String param,String param2){}
}

4.3、解析注解

package org.cc.annotation.use;import java.lang.annotation.Annotation;
import java.lang.reflect.Field;import org.cc.annotation.Controller;
import org.cc.annotation.Inject;/*** 使用反射来解析注解* @author cc**/
public class JXAnnotation {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, NoSuchMethodException {Class clazz = Class.forName("org.cc.annotation.use.TestController");Annotation[] annotations = clazz.getAnnotations();//得到指定类的所有注解for (Annotation a: annotations ) {System.out.println(a);}Controller c = (Controller)clazz.getAnnotation(Controller.class);//得到类特定的注解System.out.println(c.value());Field f = clazz.getDeclaredField("injectStr");Inject inject = f.getAnnotation(Inject.class);System.out.println(inject.value());Class clazz1 = Class.forName("org.cc.annotation.use.SubTestController");Controller c1 = (Controller)clazz1.getAnnotation(Controller.class);//得到类特定的注解System.out.println(c1);//因为定义Controller时没有使用Inherited元注解,所以子类SubTestController并不会继承父类的注解Controller//注意仅仅针对类,成员属性和方法不受此注释影响,就是说子类方法上的注解一定会继承父类的注解}}

五、定义和使用注解需要注意的地方

1、自定义注解我们可以看到有一行String value() ,类似于定义一个方法,这行代码表示使用注解时必须指定value属性值,像这样:@Controller("testController")或者这样写@Controller(value="testController"),不能这样写:@Controller(),编译会报错。如果非要这样使用,那么需要修改这个注解的定义,改成这样String value() default "";或者直接将String value()这一行删掉。

简单描述就是:如果定义注解时定义了value属性,那么使用时必须设置value属性值,或者提供默认的属性值。

2、定义注解时属性是什么类型,那么使用注解时设置的属性值必须跟定义的类型相同。下面这种情况也是可以的:定义时属性值类型为字符串数组,然后使用时设置属性值为字符串。

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA基础篇】IO流

一、流的概念 “对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务。” ――《Think in Java》 无论是系统、还是语言的设计中IO的设计都是异常复杂的。面临的最大的挑战一般是如何覆盖所有可能的因素,我们不仅仅要考虑文件、…

SpringMVC注解

一,RequestMapping 可以用在类和方法上 1.1 作用: 将客户端请求映射到可匹配的类和方法中 1.2 属性: name 给映射指定一个名字 path(同value相同) 请求的url,path{"/mixedAttribute1","/mixedA…

【JAVA基础篇】运算符

一、表达式 表达式由运算符和操作数组成 例如: 5 num1 num1num2 sumnum1num2 二、运算符分类 算数运算符、赋值运算符、关系运算符、逻辑运算符、条件运算符、位运算符 三、算数运算符 四、赋值运算符 格式:变量表达式 例如:int n3…

a4纸网页打印 table_打印模板不愁人,你还在打印单调的A4纸吗?

软件介绍早在几年前,社会上就已经开始了数字化、无纸化的推广,但是就算再怎么无纸化,纸张还是有它必要的存在,在工作、学习过程中,打印的需求也必不可少的。但是一般的打印都是比较平庸的,要做会议记录&…

IP地址、子网掩码、网关、默认网关、DNS的理解

IP地址 Internet上为了区分数以亿计的主机而给每个主机分配一个专门的地址,通过IP地址可以访问到每台主机。 子网掩码 子网掩码又称网络掩码、地址掩码、子网络遮罩。它是用来指明一个IP地址哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位…

上证指数30年k线图_技术预判2020:上证指数要突破3500点才会“井喷”

2019年的行情很快就要收官了,截止目前,上证指数今年的涨幅是20.5%,不过可能有部分投资者今年的收益率还没达到大盘指数的平均水平。不管怎样,今年很快就要翻篇了,关键是看2020年股市能不能迎来更好的行情了。而总结得失…

【JAVA基础篇】基本数据类型及自动类型转换

一、8种基本数据类型以及占用内存空间大小 boolean 1byte或4byte byte 8bit/1byte char 16bit/2byte short 16bit/2byte float 32bit/4byte int 32bit/4byte long 64bit/8byte double 64bit/8byte 二、自动类型转换 …

的优缺点_浅谈桉木家具的优缺点

家具现在的材质是有很多的,木质的,石材的,还有真空充气的,都是很不错的类型。桉木家具是现在很多人都喜欢的一种材质,但是很多人对桉木家具的优缺点不是很清楚,为了能够让大家更加清楚的了解桉木家具&#…

【算法篇】递归

一、递归的概念 程序调用自身的编程技巧称为递归。 递归的核心思想就是将一个大规模复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。 二、递归的优点 使用递归的好处是只需要少量的代码就可以描述出求解问题过程中多次重复的计算,大大减少了程序…

客户说发货慢怎么回复_女生微信说身体不舒服怎么回复关心她?

当你不在女生身边,女生微信给你说身体不舒服,肯定需要说点话来安慰她了。多喝热水肯定是不行了,一点用处都没有,还会让女生觉得你根本不重视她,是在敷衍她,那女生微信说身体不舒服怎么回复关心她呢&#xf…

【算法篇】八种内排序算法

常用的八种内排序算法分别是: 交换排序:冒泡排序、快速排序选择排序:简单选择排序、堆排序插入排序:直接插入排序、希尔排序归并排序基数排序 内排序巧记:选(选择)舰(简单选择)队(堆)的时候脚(交换)毛(冒泡)快(快速)&…

数据分析专题报告范文6篇_小学生看图写话范文:小熊玩跷跷板?(6篇),让孩子参考练习...

​范文01:小熊跷跷板一天,天气晴朗,胖乎乎的小熊和小白兔一起玩跷跷板。小熊一屁股坐在地上,小白兔说:“啊!我有恐高症哇!”小熊说:“我比你重,所以你没有办法把我翘起来…

PL/SQL

1 PL/SQLPL/SQL:过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环…

20sccm_SCCM 2012安装图解教程(一步一步详细步骤)

本系列文章的环境架构如下图所示:所有服务器安装的操作系统都是windows Server 2008 R2 中文企业版。计算机名软件、版本及角色SC-DC.SC.COMwindows Server 2008 R2 Enterprise /Active Directory 2008 R2SC-SQL.SC.COMSQL Server 2008 R2 EnterpriseSC-SCCM.SC.COM…

【Java中级篇】Dom4j解析xml数据

一、依赖 <dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency> 二、test.xml <?xml version"1.0" encoding"UTF-8"?> <students>…

redis 附近的人_使用redis—geo api实现搜索附近的人,自己写的一个composer包

安装如果是应用在项目当中的话找到根目录&#xff0c;需要和 composer.json同级composer require gaopengfei/redis_lbs基本操作初始化require_once __DIR__./vendor/autoload.php;$lbs new \LBS\Services\LBSService();添加$add_params [[name > yabao_road,long > 11…

【Java中级篇】使用zxing生成二维码

一、pom.xml添加依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.google.zxing</groupId><artifa…

微信小程序弹出框竖向滚动_微信小程序 解决自定义弹出层滑动时下层页面滚动问题...

WXML将整个底层页面使用 scroll-view 包裹起来&#xff0c;设置 scroll-y 当显示弹出层的时候为 true&#xff0c; 闭关弹出层的时候为 falseWXSSPage 设置为绝对定位&#xff0c;宽高各百分之百 &#xff0c; scroll-view 高度 百分之百Page{position: absolute;width: 100%;h…

win10环境安装使用svn客户端和服务端

一、下载安装包 安装包下载传送门http://subversion.apache.org/packages.html 无法下载的童鞋去百度云下载 链接&#xff1a;https://pan.baidu.com/s/1EuGohoZKIPmRvynp5-Subw 提取码&#xff1a;ohna 链接&#xff1a;https://pan.baidu.com/s/1EJrd5DzGCBE4rRfdhuno6Q …

openglshader实现虚拟场景_opengl – 如何使用GLSL着色器将径向模糊应用于整个场景?...

我在GLSL中有一个径向模糊着色器,它采用纹理,对其进行径向模糊,并将结果呈现给屏幕.这个工作很好,到目前为止.问题在于,它将径向模糊应用于场景中的第一个纹理.但是我实际上想做的就是将这个模糊应用于整个场景.实现此功能的最佳方式是什么&#xff1f;我可以只使用着色器,还是…