JavaSE注释
注解在JavaSE中算是比较高级的一种用法了,为什么要学习注解,我想大概有以下几个原因:
1. 可以更深层次地学习Java,理解Java的思想.
2. 有了注解的基础,能够方便阅读各种框架的源码,比如hibernate,SpringMVC等等。里面就用到了大量的注解。即便无法阅读源码,以后使用这些框架,会有一种心理上的安全感。
3. 方便今后跟别人吹牛。(当然,这也很重要。)
好了,话不多说,我们开始吧。
1. 从注释的角度来理解注解
我想了很久,最终决定以这个小标题作为第一节的标题,我们在编写Java代码的时候,为了让我们的代码看起来通俗易懂,就会加上注释信息。
比如,我们写一个方法,会标注上这个方法的作者,作用,版本等信息。是的,作为一个程序员,编写优雅的注释是一个非常重要的好习惯。
例:
/**
* 用于判断是否是空字符串
* 方法名:isEmpty
* 创建人:剽悍一小兔
* 时间:2016年9月21日-下午6:56:33
* @param str
* @return boolean
*/
public static boolean isEmpty(String str) {
return null == str || str.equals("")
|| str.matches("\\s*");
}
这是一个字符串判空的函数,函数名为isEmpty,虽然看名字大概也能猜到它的作用,可是,一旦加上了注释,瞬间就变得更加清晰了,不是吗?
这种注释,当代码被执行的时候,执行机制会自动忽略掉他们,因为这些文字其实是给程序员看的,而不是给执行机制看的。
写注释是一种美德。
那么,注解又是什么呢?
我个人对它的看法是:所谓的注解,就是写给电脑看的高级注释。
你可能经常会看到代码里面出现@XXX的标志,乍一看感觉挺高深的。反正我当年就是这种感觉,头脑里第一个反应就是这肯定很难!
我还是那句话,如果你总想着复杂,那么就永远看不到简单。
我们写注释,是给人看的,而注解就是写给电脑看的。就这么简单。
这么说可能有点抽象,没关系,我们来一个快速入门吧。
2.提出问题
新建一个Java项目
项目名称就叫做Annotation吧
在src旁边右键,新建一个util包,也就是工具包。
弄一个专门处理日期的工具类
随便写一个日期格式化的方法。
package util;
import java.util.Date;
import java.text.SimpleDateFormat;
public class DateUtil {
public static String formatDate( Date date , String formatPattern ){
return new SimpleDateFormat(formatPattern).format(date);
}
}
注意,导包的时候要是java.util.Date;,而不是java.sql.Date;
测试:
Date now = new Date();//获取当前日期
System.out.println(now);
System.out.println(formatDate(now,"yyyy-MM-dd hh:mm:ss"));
控制台打印:
Wed Sep 21 19:24:57 CST 2016
2016-09-21 07:24:57
这说明,我们写的方法应该是正确的。
很好,那么接下来要解决一个什么问题呢?就是说,如果我想通过代码来获取关于这个方法的信息,那么该如何做呢?
写注释肯定是不行的,因为注释是写个程序员看的,电脑看不懂,更别提获取注释的内容了,是吧?
于是,注解,这一种高级的注释就出现了。
3.编写注解
关于注解,要明确三个问题:
- 要给谁加注解啊?
- 什么时候注解起作用啊?
- 要注解那些东西呢?
因为是快速入门,所以大概知道这些就足够了。
现在,我们来新建一个注解,毫无疑问,所谓的注解,它还是一个Java类,你不要被它吓到。
新建一个注解包。
new一个Annotation,就叫MethodNote,意思就是说,这个是加在方法上的,为了给方法加一些电脑能看得懂的说明。
第一个问题是要给谁加注解啊?那么,这个注解类是需要加在方法上的,于是就这样写:
这就表示,该注解要加在方法上。
接下来,让我们来明确第二个问题:什么时候注解起作用啊?
我们希望在程序运行的时候,注解发挥作用,就是说,当你的程序跑起来了,电脑才开始阅读这些注解。
这句话的意思就是说,我这个注解啊,是在程序跑起来的时候,RUNTIME嘛,就是跑起来的时候,才发挥作用的。
非常好,那么最后一个问题:要注解那些东西呢?
一个方法,最重要的信息包括:作用,创建时间,作者,版本,返回值等等。我们随便抽取几个,就作用和创建时间吧!
这种写法有点类似于写接口的方法。
好了,我们的第一个注解就编写完成了!写好了就马上用呗,现在我们给日期格式化的方法加上咱自己编写的注解。
@MethodNote(createTime = "2016-9-21")
public static String formatDate(Date date , String formatPattern){
return new SimpleDateFormat(formatPattern).format(date);
}
这就是所谓的注解,其实也很简单的吧。就是这么来的,它归根到底还是一个Java类。
4.通过Java反射获取方法的注解信息
好了,回到正题,我们已经对formatDate方法进行了注解,那么,既然这个注解是写给电脑看的,那么电脑就肯定有办法在其他Java类中获得这些信息,对吧?
如何获得呢,对了,用反射机制。
上代码:
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
Class classOfDateUtil = DateUtil.class;
Method formatDate = classOfDateUtil.getMethod("formatDate", Date.class,String.class);
MethodNote methodNote = formatDate.getAnnotation(MethodNote.class);
System.out.println("方法描述:" + methodNote.description());
System.out.println("创建日期:" + methodNote.createTime());
}
结果:
方法描述:作者很懒,没有写本方法的作用。
创建日期:2016-9-21
本章结束 ...
本章对Java自定义注解做了一个快速入门,希望对你有所帮助。
JavaSE注释的更多相关文章
- JavaSE | 接口| 枚举| 注释| 异常
包: 1.包的作用:(1)避免类的同名(区分类):类的全名称:包.类名 回忆:java.util.Scannerjava.util.Arraysjava.lang.Stringj(2)可以限定某些类或 ...
- Java 基础入门随笔(9) JavaSE版——文档注释
上节中写了一些static变量以及静态的方法的定义使用以及与非静态的差别,这节补充下: 如果在一个类中所有方法都为静态的,且无成员变量,这时候需要对对应的类进行限制该类无法创建对象,具体操作如下: p ...
- JavaSE(二) 关键字、标识符、注释
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1关键字与标识符 1.1 java关键字的使用 定义:被Java语言赋予了特殊含义,用做专门用途的字符串 ...
- JavaSE学习笔记01注释、标识符与基本类型
1. HelloWorld 编写代码 public class Hello{ public static void main(String[] args){ System.out.println(&q ...
- JavaSE笔记-注释
Annotation Annotation是一个接口,可以把Annotation当成一个修饰符 Annotation的定义 注解通过@interface定义 public @interface Tes ...
- 3.JavaSE之注释
- 用大白话聊聊JavaSE -- 自定义注解入门
注解在JavaSE中算是比较高级的一种用法了,为什么要学习注解,我想大概有以下几个原因: 1. 可以更深层次地学习Java,理解Java的思想. 2. 有了注解的基础,能够方便阅读各种框架的源码,比如 ...
- javaSE基础02
javaSE基础02 一.javac命令和java命令做什么事情? javac:负责编译,当执行javac时,会启动java的编译程序,对指定扩展名的.java文件进行编译,生成了jvm可以识别的字节 ...
- javaSE学习路线
Java SE大致可分为以下几块内容: n 对象导论:如何用面向对象的思路来开发 n 深入JVM:Java运行机制以及JVM原理 n 面向对象的特征:封装.继承.抽象.多态 n 数组和容器:容 ...
随机推荐
- JS 中的require 和 import 区别整理
ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使 ...
- JqueryEasyUI EasyLoader
EasyLoader(简单加载) 对象的属性和方法: 使用: <script src="~/jquery-easyui-1.5.2/jquery.min.js">< ...
- docker 容器启动并自启动redis
centos7.5 背景:每次开机后都要自动启动redis,也就是宿主机开机,启动容器,然后启动redis 按照网上的做法是:修改redis.conf ,修改redis的启动脚本(utils/...s ...
- Effective C++ .09 不在构造和析构过程中调用virtual函数
看过C++对象模型的话就可以知道,在构造基类时,完整的vtable没有建立起来(表项没有被相应的子类函数替换),因而无法调用到子类的函数(即构造函数中的virtual函数是本类里的方法,不是virtu ...
- nodejs的get与post
index.html <html> <body> <form action="/api/v1/records" method="post&q ...
- nodejs繁琐地自建路由
一.繁琐的自建路由 app.js var server = require('./server'); server.startServer(); server.js var http = requir ...
- vue学习笔记(一)
一.MVC 和 MVVM 的区别 MVC: Model(模型)应用程序中用于处理应用程序数据逻辑的部分(通常模型对象负责在数据库中存取数据). View(视图)显示数据(通常视图是依据模型数据创建的) ...
- 001Java锁之synchronized
01.synchronized & Lock synchronized锁同步 软件层面依赖JVM Lock锁同步 硬件层面依赖cpu指令 02.synchronized作用域 方法:锁住对象实 ...
- AGS API for JS代理页的使用
AGS API for JS代理页的使用 1.概述 代理页即使用后端语言编写的请求转发页面,部署在Web应用端.客户端请求先发送到该代理页,代理页再将该请求转发到服务器处理,服务器处理结果再经代理页转 ...
- Windows 8 Metro风格颜色表-Metro colours
http://huaban.com/pins/538986818