如何查看注解实现_该怎么运用注解呢?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 教程中,实例和巧思信手拈来,能给读者清晰的思维结构,这就是为什么,异步君如此推荐!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值