如何查看注解实现_该怎么运用注解呢?Java团队元老有话说

999be3cab31c1dcbbccd0ce30eca24a6.png

来源 | 异步

15讲能学好诞生24年的JAVA吗?你当然会感到怀疑,众所周知,在技术向的IT论坛上,“如何在十天之内快速掌握好Java?”这类问题,往往会招来嘲笑。

75bcecd09be28d28c64b375c2d3b5e60.png

来源于知乎

但在当下,5分钟能看完一部电影,20分钟能略读《三体全集》,十天进阶JAVA,并非难于登天之事。

初学者请教“窍门”,不应受斥责,将心比心,谁都不愿走弯路。但编程是一门需要解决实际问题的学问,不仅要学,更要实际操作

Java被广泛应用于企业级产品的开发中,求职者需要丰富的实际操作经验,想在竞争中脱颖而出,就必须提高技术深度和软实力。

dc1e8db5c9bdc90b9dd898059aea28c5.png

你需要系统地掌握这一系列知识:注释、类加载器、反射、代理、内部类、正则表达式、IO和NIO、Lambda表达式……然后动手,把知识应用到你Java程序上的指令栏里!不断运行、试错、反思。

《JAVA教程15讲》作者,资深大咖郭屹,曾供职于Sun公司技术研发中心Java团队,他劝导年轻人:

“编程,不仅仅是学,更重要的是做。说到底它是一个手艺活。曾经有好些入门的年轻人问我如何编得一手好程序?我的回答总是‘无他无他,惟手熟尔’。”

异步君不鼓励大家过分寻求“捷径“,但站在巨人的肩膀上,无疑能看的更远。因此,大家需要通过模仿《Java编程十五讲》中的程序实例,来提升能力!

9b12322025a4c6105195f2efa03bc6f4.png

大神重视细节,例如注解,很多人认为它无足轻重,但在郭屹眼中,注解与注释不可混为一谈,注解会影响程序的运行,必须被慎重对待。他是怎样灵活运用注解的呢?一起来看!

注解

1、讲解意义

在编Java程序的时候,我们经常会碰到注解。

@Override 我们在写子类继承父类的时候,会经常用到这个注解。它告诉编译器这个方法是要覆盖父类的方法的。

@WebServlet("/myservlet") 在进行Web程序开发的时候,我们用这个注解表示这个类是一个servlet。Web容器会识别这个注解,在运行的时候调用它。

很多人说注解是注释,初看起来有一点像,它对程序的编写和编译似乎没有什么影响,只是给人看的一个对程序的附注。从这点上,确实有一点像注释。不过,它跟注释不同的是,它会影响程序的运行。

ea416c0ac57ad4744a6590445471e96d.png

上面提到的@Override,如果实现的时候没有覆盖父类的方法,编译器会给出错误提示;再比如,上面的@WebServlet,如果没有这个注解,程序是运行不起来的。

由此看来,注解并不是注释,注释是给人看的,并不影响程序的编译和运行时候的行为。注解其实不是给人看的,那么它是给谁看的呢?

它被设计出来,是用于给另外的程序看的,比如编译器,比如框架,比如Web容器。这些外在的程序通过某种方式查看到这些注解后,就可以采取相应的行为。

2、具体解释

假如我们要做一个Web容器,类似于Tomcat这种的。

那么,容器启动的时候,可以扫描全部类,找到包含@WebServlet注解的,识别它们,然后加载它们。那么,这个@WebServlet注解就是在运行时起作用的,Java里面把它的作用范围规定为RUNTIME。

再看@Override,这个是给编译器看的。编译程序读用户程序的源代码,识别出有@Override注解的方法,就去检查上层父类相应方法。

23737a81f55d0f3996c2d73938dc4743.png

这个@Override注解就是在编译的时候起作用的,编译之后,就不存在了。Java里面把它的作用范围规定为SOURCE。

类似的注解还有@Test,程序员写好了程序,想交给测试框架去测试自己写的方法,就可以用这个注解。测试框架会读取源代码,识别出有@Test注解的方法,然后生成测试代码就可以进行测试了。

3、实际操作

接下来,我们自己动手做一个注解看看效果加深理解。

我们想做的例子是一个运行时框架加载别的客户类,并运行其中的初始化方法。作为框架,我们可以提供一个@InitMethod注解给客户程序员。客户类代码如下:

7b5cbc85d75cda2bf928ed8abeb8c9ae.png

客户类程序员在init()方法上标注了@InitMethod注解,声明这就是本类的初始化方法。框架程序利用这个注解识别它,并调用它。

接下来我们看怎么提供这个注解的实现。代码如下:

2fe2edb3f76a44c31a45d807397cd1b7.png

第一次看到这个注解的实现的时候,人们都会大吃一惊,觉得很像是在定义一个接口。的确是很像,Java 5之后,提供了这样的手段,让人定义注解。上面就声明了有一个叫InitMethod的注解,它是修饰方法的,在运行时可见。

我们作为框架程序的作者,既然提供了这个注解,就有责任实现它,代码如下:

a9a8c77608c2620d6db207895d16a13c.png

为了从客户类InitDemo里面读出注解信息,需要用到反射机制。先通过Class.forName()加载类拿到Class信息;然后通过getMethods()拿到所有public的方法(包含从上层父类继承下来的公共方法);

接下来是重点

method.isAnnotationPresent(InitMethod.class),这一行判断一个方法是否标记为InitMethod;如果是,则创建一个对象并调用。这样在框架中实现了对类的初始化方法进行调用。

4、技术拓展

下面介绍更多的一些特性。注解的基本定义如下:

9624fb5354580b3bf0d7d0d20ffdcabb.png

运行上面的程序,就能看到确实调用了初始化方法。我们定义的注解工作了。注解基本的使用就是这样的,一点也不神秘。

作为学习者,我们应该怎样学习?

第一步、最先了解的是注解的概念,学习使用现成的注解,;

第二步、接下来就要自己写RUNTIME类型的注解,实现一些框架的效果;

第三步、就是自己写SOURCE类型的注解,提供各种源代码级别的工具。

学习的进路,就这么一步步深入下去。掌握了后,就有拨开丛林,见到本尊的愉悦,体会获得知识的愉悦感。

49e161fad062db3b9aeb63483e88bb3a.png

郭屹老师遣词精准,善于循循善诱,在他的JAVA 教程中,实例和巧思信手拈来,能给读者清晰的思维结构,这就是为什么,异步君如此推荐!

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

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

相关文章

NXP S32K144开发(一)环境搭建和新建工程

1、首先需要安装S32 Design Studio for ARM,在NXP官网可以搜索到,这玩意也是基于eclipse的 安装好后就可以打开了。 2、新建工程 过程可以参考NXP官网: https://www.nxp.com/document/guide/get-started-with-the-s32k144evb:NGS-S32K144E…

首先记录异常的根本原因

Logback日志库的0.9.30版本带来了一个很棒的新功能:从根(最内部)异常而不是最外部异常开始记录堆栈跟踪。 当然,我的兴奋与我贡献了此功能无关。 用塞西尔德米勒(Cecil B. de Mille) 的话来解释&#xff1a…

Android 中的 Service 全面总结

1、Service的种类 按运行地点分类: 类别区别 优点缺点 应用本地服务(Local)该服务依附在主进程上, 服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不…

找出互联网类似以下图的实例

转载于:https://www.cnblogs.com/sghcjy/p/4978851.html

使用Spring MVC开发Restful Web服务

REST简介 摘自Wikipedia: REST风格的体系结构由客户端和服务器组成。 客户端向服务器发起请求; 服务器处理请求并返回适当的响应。 请求和响应围绕资源表示的传递而构建。 资源本质上可以是可以解决的任何连贯且有意义的概念。 正如您所阅读的&#xff0…

端到端测试的滥用–测试技术2

我的上一个博客是有关测试代码方法的一系列博客中的第一篇,概述了使用一种非常常见的模式从数据库检索地址的简单方案: …并描述了一种非常通用的测试技术: 不编写测试 , 而是手动进行所有操作。 今天的博客涵盖了另一种实践&…

那些年困扰我们的Linux 的蠕虫、病毒和木马

虽然针对Linux的恶意软件并不像针对Windows乃至OS X那样普遍,但是近些年来,Linux面临的安全威胁却变得越来越多、越来越严重。个中原因包括,手机爆炸性的普及意味着基于Linux的安卓成为恶意黑 客最具吸引力的目标之一,以及使用Lin…

(转)FPGA异步时序和多时钟模块

http://bbs.ednchina.com/BLOG_ARTICLE_3019907.HTM 第六章 时钟域 有一个有趣的现象,众多数字设计特别是与FPGA设计相关的教科书都特别强调整个设计最好采用唯一的时钟域。换句话说,只有一个独立的网络可以驱动一个设计中所有触发器的时钟端口。虽然…

怎么检测不到我的音频_Linux 上的最佳音频编辑工具推荐 | Linux 中国

在 Linux 上,有很多种音频编辑器可供你选用。不论你是一个专业的音乐制作人,还是只想学学怎么做出超棒的音乐的爱好者,这些强大的音频编辑器都是很有用的工具。-- Ankush Das(作者)在 Linux 上,有很多种音频编辑器可供你选用。不论…

具有GlassFish和一致性的高性能JPA –第3部分

在我的四部分系列的第三部分中,我将解释将Coherence与EclipseLink和GlassFish结合使用的第二种策略。 这就是通过EclipseLink使用Coherence作为二级缓存(L2)的全部内容。 一般的做法 这种方法将Coherence数据网格应用于依赖于无法完全预加载到…

精选30道Java笔试题解答(转)

都是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我一样参加各大IT校园招聘的同学们,纯考Java基础功底, 老手们就不用进来了,免得笑话我们这些未出校门的孩纸们,但是I…

list取值_Redis中List及quicklist实现-2

上一篇中看了List的使用方式、quicklist中的各个结构体,这一篇来看看quicklist里面的几个核心函数,quicklistCreate函数、quicklistCreateNode函数、quicklistPush函数、quicklistPop函数。接下来我们通过源码看一下quicklist中是如何借鉴STL中deque的这…

通过示例休眠–第1部分(删除孤儿)

所以我想做一系列的冬眠例子,展示冬眠的各种特征。 在第一部分中,我想展示有关删除孤儿功能及其在故事情节中的使用方法。 因此,让我们开始:) 先决条件 : 为了尝试以下示例,您将需要以下提到的JAR文件: …

Win10手记-IIS部署网站问题解决

最近在自己的Win10电脑上尝试部署ASP.NET网站时出现了问题,经过多方查找定位到IIS为问题来源。 开始之前 先描述下技术环境: 1.Windows 10 PC 2.Windows 自带的IIS 7 3.ASP.NET Web API项目网站 4.VS 2015 问题描述 首先我们为PC安装IIS,按照…

CentOS 7 安装记录

由于centos6.4版本有点老,所以换到centos7。 1.安装 CentOS 7.0系统安装配置图解教程 2.linux设置网卡开机启动 实质linux是看一个网卡文件的配置,就是/etc/sysconfig/network-scripts/ifcfg-eth0 (这个文件名看你网卡名称而异,具体你到该目录…

通知栏发送消息Notification(可以使用自定义的布局)

一个简单的应用场景:假如用户打开Activity以后,按Home键,此时Activity 进入-> onPause() -> onStop() 不可见。代码在此时机发送一个Notification到通知栏。当用户点击通知栏的Notification后,又重新onRestart() -> onSt…

退出页面删除cookie_Cookie 机制

欢迎关注公众号 学习资料不会少01「HTTP 协议是无状态的」对于浏览器的每一次请求,服务器都会独立处理,不与之前或之后的请求发生关联。这个过程如图 11-1 所示,3次“请求/响应”之间没有任何关系。即使是同一个浏览器发送了3个请…

Oracle WebLogic Java云服务–幕后花絮。

在开放世界方面,发生的一件大事可能是出乎意料的消息,那就是Oracle最终支持云计算发展并提供自己的公共云服务 。 除了官方公告之外,Aquarium上( 此处和此处 )的内容或多或少都没有多少内容,您找不到很多信…

QT子窗口及停靠实现

Demo的效果 头文件中的变量声明 //退出动作QAction* exit;//菜单栏菜单QMenu* filemenu;QMenu* actiona;//在状态栏的标签控件QLabel* label;//两个停靠窗口QDockWidget *dockwidget;QDockWidget *dockwidget_textbox; CPP源文件中的对象定义 //创建初始化按钮,将要放到第一个窗…

Html转Word文档,解决无法保存网络图片的问题

最近项目中需要这个功能,网上有很多word转html的方法,但是html转word的方法很少,因为html中的图片转换到本地比较麻烦; 开始的时候只能转换不带图片的html内容,但是不符合要求,将html页面中的图片改成绝对路…