如何查看注解实现_该怎么运用注解呢?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…

成功醒言

成功醒言 C01 只有敢犯错误的人才能成事; 只有不犯同样错误的人才能成大事。 C02 固执≠执著; 幻想≠希望。 固执是无目标的执著; 执著是有目标的固执。 幻想是无法兑现的希望; 希望是有望实现的幻想。 固执地执著幻想&#xf…

Android 中的 Service 全面总结

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

python基础学习1-三元表达式和lambda表达式

#!/usr/bin/env python # -*- coding:utf-8 -*- 三元运算 if else 的简写name "alex" if 11 else "SB" #如果条件成立 赋alex 否则 赋SB print(name)#--------------lambda表达式 f2 lambda a1,a2:a1a2100 #等价 下边函数定义 def f1(a1,a2): return …

怎么让存储过程通用化_怎么做分布式存储的面试?

cholerae 大神已经做了详细回答,http://zenlife.tk/interview-for-distributed-storage.md写于几年前,内容有点稚嫩,WAL辨识度很高, 其他问题一般.CAP不会再问了,专业的存储文献中很少(几乎不)提及CAP或PACELC, 这个词用于市场和销…

Java EE中的配置管理

我尝试配置管理在云计算中具有很多相关性 争论 较早。 实际上,我大胆地宣称配置管理是任何认真尝试从软件中节省几美元的基石。 那么什么是配置管理及其主要目标? 在不使事情变得过于复杂的情况下,我认为接下来的两个目标与事实相差不远。 以…

十年总结,一个JAVA人的十年人生路

十年总结-开篇:歇一歇,才能走的更远经常见坛子里有人问,学习java该如何入手,或者是该学java还是学XX语言。我一直觉得,编程跟语言关系不大,重点是要有解决问题的思路。学习一门语言,其实只是寻求…

(四)Qt实现自定义模型基于QAbstractTableModel (一般)

Qt实现自定义模型基于QAbstractTableModel 两个例子 例子1代码 Main.cpp #include <QtGui>#include "currencymodel.h"int main(int argc, char *argv[]) {QApplication app(argc, argv);//数据源QMap<QString, double> currencyMap;currencyMap.insert(…

pt-query-digest使用介绍【转】

本文来自&#xff1a;http://isadba.com/?p651 一、pt-query-digest参数介绍. pt-query-digest --useranemometer --passwordanemometerpass --review h192.168.11.28,Dslow_query_log,tglobal_query_review \--history h192.168.11.28,Dslow_query_log,tglobal_query_re…

python代码模板_python 代码模板

python中的Module是比较重要的概念。常见的情况是&#xff0c;事先写好一个.py文 件&#xff0c;在另一个文件中需要import时&#xff0c;将事先写好的.py文件拷贝 到当前目录&#xff0c;或者是在sys.path中增加事先写好的.py文件所在的目录&#xff0c;然后import。这样的做法…

Java并发教程–重入锁

Java的synced关键字是一个很棒的工具–它使我们能够以一种简单可靠的方式来同步对关键部分的访问&#xff0c;而且也不难理解。 但是有时我们需要对同步进行更多控制。 我们要么需要分别控制访问类型&#xff08;读取和写入&#xff09;&#xff0c;要么使用起来很麻烦&#xf…

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

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

python比较运算符重载_python运算符重载

1、打印操作会首先尝试__str__和str内置函数&#xff0c;他通常返回一个用户友好显示。__repr__用于所有其他环境&#xff0c;用于交互式模式下提示回应以及repr函数&#xff0c;如果没有使用__str__&#xff0c;则会使用print和str。它通常返回一个编码字符串&#xff0c;可以…

使用Spring MVC开发Restful Web服务

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

深入Java核心 Java内存分配原理精讲

深入Java核心 Java内存分配原理精讲 Java内存分配与管理是Java的核心技术之一&#xff0c;之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识&#xff0c;今天我们再次深入Java核心&#xff0c;详细介绍一下Java在内存分配方面的知识。一般Java在内存分配时…

iOS正则表达式(亲测,持续更新)

先来说说判断方法,书写不简介但是好理解: -(BOOL)isRealNmaeString:(NSString *)str{NSString *pattern "填写正则表达式";NSPredicate *pred [NSPredicate predicateWithFormat:"SELF MATCHES %", pattern];BOOL isMatch [pred evaluateWithObject:str…

python新建一个文件夹需要重新安装模块吗_解决pycharm每次新建项目都要重新安装一些第三方库的问题...

目前有三个解决办法&#xff0c;也是亲测有用的&#xff1a;第一个方法&#xff1a;因为之前有通过pycharm的project interpreter里的号添加过一些库&#xff0c;但添加的库只是指定的项目用的&#xff0c;如果想要用&#xff0c;就必须用之前的项目的python解释器&#xff0c;…

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

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

[AlwaysOn Availability Groups]排查:AG超过RPO

[AlwaysOn Availability Groups]排查&#xff1a;AG超过RPO 排查&#xff1a;AG超过RPO 在异步提交的secondary上执行了切换&#xff0c;你可能会发现数据的丢失大于RPO&#xff0c;或者在计算可以忍受的数据都是超过了RPO。 1.通常原因 1.网络延迟太高&#xff0c;网络吞吐量太…