15讲能学好诞生24年的JAVA吗?你当然会感到怀疑,众所周知,在技术向的IT论坛上,“如何在十天之内快速掌握好Java?”这类问题,往往会招来嘲笑。
但在当下,5分钟能看完一部电影,20分钟能略读《三体全集》,十天进阶JAVA,并非难于登天之事。
初学者请教“窍门”,不应受斥责,将心比心,谁都不愿走弯路。但编程是一门需要解决实际问题的学问,不仅要学,更要实际操作。
Java被广泛应用于企业级产品的开发中,求职者需要丰富的实际操作经验,想在竞争中脱颖而出,就必须提高技术深度和软实力。
你需要系统地掌握这一系列知识:注释、类加载器、反射、代理、内部类、正则表达式、IO和NIO、Lambda表达式……然后动手,把知识应用到你Java程序上的指令栏里!不断运行、试错、反思。
《JAVA教程15讲》作者,资深大咖郭屹,曾供职于Sun公司技术研发中心Java团队,他劝导年轻人:
“编程,不仅仅是学,更重要的是做。说到底它是一个手艺活。曾经有好些入门的年轻人问我如何编得一手好程序?我的回答总是‘无他无他,惟手熟尔’。”
异步君不鼓励大家过分寻求“捷径“,但站在巨人的肩膀上,无疑能看的更远。因此,大家需要通过模仿《Java编程十五讲》中的程序实例,来提升能力!
大神重视细节,例如注解,很多人认为它无足轻重,但在郭屹眼中,注解与注释不可混为一谈,注解会影响程序的运行,必须被慎重对待。他是怎样灵活运用注解的呢?一起来看!
注解
1、讲解意义
在编Java程序的时候,我们经常会碰到注解。
@Override 我们在写子类继承父类的时候,会经常用到这个注解。它告诉编译器这个方法是要覆盖父类的方法的。
@WebServlet("/myservlet") 在进行Web程序开发的时候,我们用这个注解表示这个类是一个servlet。Web容器会识别这个注解,在运行的时候调用它。
很多人说注解是注释,初看起来有一点像,它对程序的编写和编译似乎没有什么影响,只是给人看的一个对程序的附注。从这点上,确实有一点像注释。不过,它跟注释不同的是,它会影响程序的运行。
上面提到的@Override,如果实现的时候没有覆盖父类的方法,编译器会给出错误提示;再比如,上面的@WebServlet,如果没有这个注解,程序是运行不起来的。
由此看来,注解并不是注释,注释是给人看的,并不影响程序的编译和运行时候的行为。注解其实不是给人看的,那么它是给谁看的呢?
它被设计出来,是用于给另外的程序看的,比如编译器,比如框架,比如Web容器。这些外在的程序通过某种方式查看到这些注解后,就可以采取相应的行为。
2、具体解释
假如我们要做一个Web容器,类似于Tomcat这种的。
那么,容器启动的时候,可以扫描全部类,找到包含@WebServlet注解的,识别它们,然后加载它们。那么,这个@WebServlet注解就是在运行时起作用的,Java里面把它的作用范围规定为RUNTIME。
再看@Override,这个是给编译器看的。编译程序读用户程序的源代码,识别出有@Override注解的方法,就去检查上层父类相应方法。
这个@Override注解就是在编译的时候起作用的,编译之后,就不存在了。Java里面把它的作用范围规定为SOURCE。
类似的注解还有@Test,程序员写好了程序,想交给测试框架去测试自己写的方法,就可以用这个注解。测试框架会读取源代码,识别出有@Test注解的方法,然后生成测试代码就可以进行测试了。
3、实际操作
接下来,我们自己动手做一个注解看看效果加深理解。
我们想做的例子是一个运行时框架加载别的客户类,并运行其中的初始化方法。作为框架,我们可以提供一个@InitMethod注解给客户程序员。客户类代码如下:
客户类程序员在init()方法上标注了@InitMethod注解,声明这就是本类的初始化方法。框架程序利用这个注解识别它,并调用它。
接下来我们看怎么提供这个注解的实现。代码如下:
第一次看到这个注解的实现的时候,人们都会大吃一惊,觉得很像是在定义一个接口。的确是很像,Java 5之后,提供了这样的手段,让人定义注解。上面就声明了有一个叫InitMethod的注解,它是修饰方法的,在运行时可见。
我们作为框架程序的作者,既然提供了这个注解,就有责任实现它,代码如下:
为了从客户类InitDemo里面读出注解信息,需要用到反射机制。先通过Class.forName()加载类拿到Class信息;然后通过getMethods()拿到所有public的方法(包含从上层父类继承下来的公共方法);
接下来是重点:
method.isAnnotationPresent(InitMethod.class),这一行判断一个方法是否标记为InitMethod;如果是,则创建一个对象并调用。这样在框架中实现了对类的初始化方法进行调用。
4、技术拓展
下面介绍更多的一些特性。注解的基本定义如下:
运行上面的程序,就能看到确实调用了初始化方法。我们定义的注解工作了。注解基本的使用就是这样的,一点也不神秘。
作为学习者,我们应该怎样学习?
第一步、最先了解的是注解的概念,学习使用现成的注解,;
第二步、接下来就要自己写RUNTIME类型的注解,实现一些框架的效果;
第三步、就是自己写SOURCE类型的注解,提供各种源代码级别的工具。
学习的进路,就这么一步步深入下去。掌握了后,就有拨开丛林,见到本尊的愉悦,体会获得知识的愉悦感。
郭屹老师遣词精准,善于循循善诱,在他的JAVA 教程中,实例和巧思信手拈来,能给读者清晰的思维结构,这就是为什么,异步君如此推荐!