java注释的理解,java注解原理——记录一下自己的理解

最近因为系统可能要更换成java语言,于是每天都在拼命的研究java的相关知识和框架。之前学习注解的时候,没有太深入的去理解它,只是觉得标注一下挺好用,但是现在在学到spring aop的时候,突然发现注解的功能是如此强大。不得已,只好仔细来研究一下注解的原理性问题了。

首先,网上有各种介绍注解是运用反射机制,但是我相信很多人其实并不熟练运用反射,当然我这个菜鸟更是如此。但好在反射虽并不常用,但是很好理解。而注解就显得绕口很多。

言归正传,现在开始用我那白的不能再白的大白话跟大家讲解一下了(毕竟这个行业总是喜欢搞一些装逼的高大上的词汇)。

为了更好的向大家解释,我还是先贴代码吧(大家直接copy到自己的IDE上去跑就好)。BusinessLogic.javapackage annotationTest;

/** * @author  kalson

* @date 创建时间:2017年11月7日 下午1:13:14

* @version 1.0

*/

public class BusinessLogic {

public BusinessLogic() {

super();

}

public void compltedMethod() {

System.out.println("This method is complete");

}

@Todo(priority = Todo.Priority.HIGH)

public void notYetStartedMethod() {

// No Code Written yet

}

@Todo(priority = Todo.Priority.MEDIUM, author = "Uday", status = Todo.Status.STARTED)

public void incompleteMethod1() {

//Some business logic is written

//But its not complete yet

}

@Todo(priority = Todo.Priority.LOW, status = Todo.Status.STARTED )

public void incompleteMethod2() {

//Some business logic is written

//But its not complete yet

}

}

Todo

package annotationTest;

/** * @author  kalson

* @date 创建时间:2017年11月7日 下午1:12:57

* @version 1.0

*/

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@interface Todo {

public enum Priority {LOW, MEDIUM, HIGH}

public enum Status {STARTED, NOT_STARTED}

String author() default "Yash";

Priority priority() default Priority.LOW;

Status status() default Status.NOT_STARTED;

}

TodoReport

package annotationTest;

/** * @author  kalson

* @date 创建时间:2017年11月7日 下午1:13:27

* @version 1.0

*/

import java.lang.reflect.Method;

public class TodoReport {

public TodoReport() {

super();

}

public static void main(String[] args) {

getTodoReportForBusinessLogic();

}

/**

* This method iterates through all messages of BusinessLogic class and fetches annotations defined on each of them.

* After that it displays the information from annotation accordingly.

*/

private static void getTodoReportForBusinessLogic() {

Class businessLogicClass = BusinessLogic.class;

for(Method method : businessLogicClass.getMethods()) {

Todo todoAnnotation = (Todo)method.getAnnotation(Todo.class);

if(todoAnnotation != null) {

System.out.println(" Method Name : " + method.getName());

System.out.println(" Author : " + todoAnnotation.author());

System.out.println(" Priority : " + todoAnnotation.priority());

System.out.println(" Status : " + todoAnnotation.status());

System.out.println(" --------------------------- ");

}

}

}

}

创建了三个类,一个BusinessLogic.java,要被注解的类

一个Todo.java,注解类

一个TodoReport ,测试类。

注解机制最终要的运用了反射机制就是由于如下代码部分Class businessLogicClass = BusinessLogic.class;

这个Class 的运用想必大家见过但是并没有认真理解过。所谓的类的类创建,说起来比较拗口,但是我举一个不恰当的例子。

理念一:假设把克隆当作java中new实例对象的过程,那么这个模型就是我们自己创建的类,但是克隆的原型其实并不是最底层,底层而是细胞,所以如果你想new一个对象,那你就需要先把这个模型new出来,而注解就是作用在这个过程,也就是说,JVM识别注解是在创建模型类的时候就开始识别了。

理念二:其次,需要再跟大家解释的一个问题就是,套用网上内容Annotations仅仅是元数据,和业务逻辑无关。所以,如果你在学习AOP等各种框架的时候,时刻想着,它的逻辑部分都是框架来实现的,暴露给用户的都只是一些标志点而已。至于逻辑部分,只好大家发挥脑洞,自己去猜测了。

==========================================================================================

有了上面两点理念之后,现在我们再来看一下一个用到spring框架的例子。@Aspect   --说明这是一个切面类

public class Logging {

@Pointcut("execution(* com.yiibai.*.*(..))")//比如说这个注解,

JVM启动开始创建各种类的类对象的时候,就会识别到这个注解,它的逻辑是什么样的,由

spring框架来指定(比如说是对com.yiibai.下的所有类的所有方法都用selectAll做标记)。

private void selectAll() {

}

//@Before("@annotation(com.yiibai.Loggable)")

@Before("selectAll()")//比如说识别到Before这个注解的时候,会对selectAll标记的方法前绑定

beforeAdvice方法。这也是由spring框架来做的,所以我们看不到。

public void beforeAdvice() {

System.out.println("going to setup student profile");

}

@After("selectAll()")

public void afterAdvice() {

System.out.println("Student profile has been setup.");

}

//@AfterReturning("selectAll()")

public void afterReturningAdvice(Object retval) {

System.out.println("returing" + retval.toString());

}

//@AfterThrowing("selectAll()")

public void afterThrowingAdvice(IllegalArgumentException ex) {

System.out.println("There has been an exception: " + ex.toString());

}

}

由于目前只是学习阶段,还没有做对框架的底层研究,所以以上的观念纯属个人对这方面的抽象理解,希望大家能够结合自己的知识指正或者希望可以帮助大家理解注解。至于以上注释中的逻辑,也纯属个人yy的结果。大家感受一下就好

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

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

相关文章

Jsoup从元素中抽取属性 文本和HTML

在解析获得一个Document实例对象,并查找到一些元素之后,我们如何取得在这些元素中的数据呢??? 使用Jsoup抽取属性,一般方法如下: 1.要取得一个属性的值,可以使用Node.attr(String k…

CSDN 技能树使用体验与产品分析(1)

文章目录1. 什么是技能树2. 技能树的产品结构3. 技能树的使用3.1 产品入口3.2 知识点的模块设置3.3 『练习题』模块3.4 『参考资料』模块3.5 『讨论区』与『笔记』模块4. 结束语C 站近期隆重推出了一个新产品『技能树』,这是一个很好的方向。 很早就想写一篇介绍和…

【OpenCV 例程200篇】213. 绘制圆形

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】213. 绘制圆形 7.1 绘图函数基本参数 OpenCV提供了绘图功能,可以在图像上绘制直线、矩形、圆、椭圆等各种几何图形。 7.3 绘制圆形 函数原型: 函数 cv.circle() 用来在图像上绘制圆形。 cv…

Jsoup处理URLs

我们在处理HTML内容时,可能经常会遇到这种问题,需要将html页面里面的链接地址从相对地址转换成绝对地址,如何使用Jsoup来解决这个问题呢? 方法 在你解析文档时确保有指定base URI,然后 使用 abs: 属性前缀来取得包含b…

matlab的fft点数,matlab fft的点数问题

看完下面的,也许你会明白点The FFT functions (fft, fft2, fftn, ifft, ifft2, ifftn) are based on a library called FFTW [3],[4]. To compute an N-point DFT when N is composite (that is, when NN1N2), the FFTW library decomposes the problem using the C…

【OpenCV 例程200篇】214. 绘制椭圆的参数详解

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】214. 绘制椭圆的参数详解 OpenCV提供了绘图功能,可以在图像上绘制直线、矩形、圆、椭圆等各种几何图形。 7.4 绘制椭圆 函数原型: 函数 cv.ellipse() 用来在图像上绘制椭圆轮廓、填充椭圆、椭…

mysql外键猫头,SQL进阶

SQL进阶1.约束之主键约束非空、唯一、被引用当表的某一列被指定为主键之后,该列就不能为空,不能有重复值出现。创建表时指定主键的两种方式:CREATE TABLE stu1(sid CHAR(6) PRIMARY KEY,sname VARCHAR(20),age INT,gender VARCHAR(10));指定s…

Jsoup获取所有链接

从一个URL获得一个页面。然后提取页面中的所有链接、图片和其它辅助内容。并检查URLs和文本信息。 运行下面程序需要指定一个URLs作为参数 package org.jsoup.examples;import org.jsoup.Jsoup; import org.jsoup.helper.Validate; import org.jsoup.nodes.Document; import …

【OpenCV 例程200篇】215. 基于多段线绘制近似椭圆

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】215. 基于多段线绘制近似椭圆 如果需要对椭圆渲染进行更多控制,或者绘制粗略的椭圆边界,可以使用 cv.ellipse2Poly 检索曲线,然后使用多段线进行渲染或使用fillPoly进行填充。 函数…

【OpenCV 例程200篇】216. 绘制多段线和多边形

专栏地址:『youcans 的 OpenCV 例程200篇』 文章目录:『youcans 的 OpenCV 例程200篇-总目录』 【youcans 的 OpenCV 例程200篇】216. 绘制多段线和多边形 函数 cv.polylines() 用来绘制多边形曲线或多段线。 函数 cv.fillPoly() 用来绘制一个或多个填充…

Jsoup设置属性值

在处理html时,我们有时候可能想在解析一个Document之后修改其中的某些属性值,如图片地址、class名称等各种属性,然后再保存到磁盘或都输出到前台页面。 可以使用属性设置方法 Element.attr(String key, String value), 和 Elements.attr(St…

matlab mat文件 太大,MATLAB .mat文件中的开销过大

这对我来说似乎是个错误.解决方法是以块的形式写入预分配的数组.从预先分配开始:fid fopen(01_hit12.par, r);data fread(fid, inf, uint8);nlines nnz(data 10) 1;fclose(fid);matObj.moleculeNumber zeros(1,nlines,uint8);matObj.isotopeologueNumber zer…

Jsoup设置一个元素的HTML内容

获取一个元素中的HTML内容&#xff0c;可以使用Element中的HTML设置方法。 示例 Element div doc.select("div").first(); // <div></div> div.html("<p>lorem ipsum</p>"); // <div><p>lorem ipsum</p><…

【youcans 的图像处理学习课】总目录

专栏地址&#xff1a;『youcans 的图像处理学习课』 【youcans 的图像处理学习课】总目录 youcansqq.com, 【youcans 的图像处理学习课】 更新日期&#xff1a;2022-06-30 本系列是学习冈萨雷斯《数字图像处理&#xff08;第四版&#xff09;》的笔记&#xff0c;篇目也是对照…

mysql数据库连接异常,mysql连接数据库时处理连接异常

连接数据库时处理连接异常 $db new PDO(‘mysql:hostlocalhost;dbnametest’, $user, $pass);$rs $db->query(“SELECT aa,bb,cc FROM foo”);if ($db->errorCode() ! ’00000′){print_r($db->errorInfo());exit;}$arr $rs->fetchAll();print_r($arr);$db nul…

【OpenCV 例程200篇】217. 鼠标交互获取多边形区域(ROI)

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】217. 鼠标交互获取多边形区域 函数 cv.selectROI 可以通过鼠标在图像上选择感兴趣的矩形区域&#xff08;ROI&#xff0c;region of interest&#xff09;。 如果要通过鼠标在图像上选择感兴趣的多边形区域&#xff0c…

Jsoup设置元素的文本内容

修改一个HTML文档中的文本内容。 示例如下 Element div doc.select("div").first(); // <div></div> div.text("five > four"); // <div>five > four</div> div.prepend("First "); div.append(" Last&qu…

php+分针和时针重合,时钟问题—两针重合

​ 时钟问题—两针重合含义&#xff1a;钟面上的分针追上时针与之重合。这种追击&#xff0c;总是分针追时针&#xff0c;追击速度为分针每分钟前进的6度减去时针每分钟前进的0.5度&#xff0c;等于5.5度。由于钟面是圆形&#xff0c;追击分为分针在后和在前两种情况&#x…

【OpenCV 例程200篇】218. 多行倾斜文字水印

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】218. 多行倾斜文字水印 8.1 添加多行倾斜文字水印 水印是叠加在图像上的标志、签名、文本或图案&#xff0c;用于保护图像的版权。 先在黑色背景上添加图像或文字制作水印&#xff0c;再使用 cv.addWeight 函数&…

Jsoup消除不受信任的HTML(用于防止XSS的攻击)

在开发网站的时候&#xff0c;经常会提供用户评论的功能。有些不怀好意的用户&#xff0c;会搞一些脚本到评论内容中&#xff0c;而这些脚本可能会破坏整个页面的行为&#xff0c;更严重的是获取一些机要信息&#xff0c;此时需要清理该HTML&#xff0c;以避免跨站脚本cross-si…