大家好,关于为什么不推荐使用Lombok很多朋友都还不太明白,今天小编就来为大家分享关于java标记不建议使用的注解的知识,希望对各位有所帮助!
本文目录
Java中的注解到底是如何工作的
什么是注解
注解是在Java5.0版本中被引入,其目的是用于描述数据,我们可以把他当作标签,每加上一个注解就相当于给类/方法/字段贴上来标签,而标签的作用我们很明白,通过标签我们可以知道这个类/方法/字段是做什么的。
为什么使用注解
在程序开发中,如果我们看到@Override,我们是很容易理解它的作用就是对实现方法的重写,而这也达到设计之初的目标,即描述数据。
继续以Override为例子,我们在实现父类方法的时候通常会带上该注解,但是我们不带也不会对运行有任何影响,但是如果我们把注解放到非实现的方法上,编译就会报错。也就是说注解会告诉编译我是做什么的,如果我做的和预期不一样,那么编译器会对我们程序进行纠错,即对不合注解含义的业务进行处理(这个处理不是注解去处理,只是看上去像是注解的作用)。
注解如何工作
对于@Override使用在非父类方法上编译报错的情况,我们最初接触的时候可能会认为这些报错的作用是注解的作用,但是实际上并不全是,这是因为注解仅仅是标签亦或者说是元数据。他的作用一开始仅仅是为类描述数据,而后衍生出来的各种功能是由前端编译器在编译成class的时候会有一个专门的注解处理器,是他在编译过程中对诸多注解,如@Override,会有专门的代码完成@Override标志的业务逻辑。简单的说,注解只是标签,而标签具有的功能是由前端编译器
在生成语法树之后有专门的代码去实现。
如果我们有使用自定义注解的经验,我们会发现如果我们单单定义一个注解放在类/方法/字段上,那么它只有一个标签的效果,并没有什么实际的意义,比如我们自定义NotEmpty注解,表达不能为空,我们将其注解加入到字段上,即使传空也没有任何问题,这是因为没有相应业务的支持。如果想要达到想要的效果,我们就需要专门写业务逻辑去实现这个NotEmpty功能
希望我的回答能对您有所帮助。
java中注解方式是否是侵入
谢邀,作为一个Java软件工程师对这个问题有自己的见解。
先搞清楚侵入性的概念当你的代码引入了一个组件,导致其它代码或者设计,要做相应的更改以适应新组件.这样的情况我们就认为这个新组件具有侵入性。显然,如果设计的代码对原有代码逻辑有代码侵入的话,是一个糟糕的设计方式。什么是侵入性?个人认为就是一旦你这段添加的代码出现异常对原本的代码会有极大影响,那你这段代码侵入性就太明显了。
而注解对代码是否有侵入性呢?要知道注解是从老版jdk就有的一个语法特性,目前广泛运用在各大框架中间件的开发中,比如我们最常用的spring框架,编程时service和autoware等注解几乎是必用的。如果说注解式编程对代码有过度侵入性,我想甲骨文公司也不会去创造注解这种东西。显然,注解本身并不会对代码造成侵入,反而他的设计是为了解耦合,通过代理等方式将需要引入的组件添加到原逻辑中。
但是注解一定不会侵入吗?答案是否定的,注解本身其实不用纠结会不会侵入,而是对注解使用过程中的开发者,是否会写出侵入性极强的代码。用注解完全可以写出侵入式的代码,比如在写spring的aop时,后置处理的代码有bug,那必然会导致原逻辑不能正常进行,这就是一种侵入,而且还影响很大。
宇文哥习惯性总结:注解是一件利器,用的好代码可以低耦合,用的不好,就会造成侵入性极强,没有最好的技术只有更好的编码者。
关注@极客宇文氏一名热心有料的Java软件工程师。为什么不推荐使用Lombok
目前Lombok并没有爆出有什么坑,还是推荐大家使用的,主要确实是方便和简洁,eclipse和idea都支持这种插件,使用起来特别方便,代码看起来很简洁,如果一个bean对象有二十几个属性,下面一大堆get和set方法,不利于代码的维护,用了Lombok插件,只要写上属性和相应的注解就可以了。
要说有什么缺点,那就是不能你一个人用,得一组人一起用,不然别人同步代码以后会报错。
Java的注解为何如此流行注解的工作原理是什么
我想注解的流行主要是因为方便。
它摒弃了java中最难的部分,配置一堆的配置文件;new一堆的类。作为程序员最直观的是代码,而不是配置文件。所以springboot就自然而然的流行起来了,他完全可以不用配置文件,通过代码实现以前的配置。
那么注解是怎么工作的呢,首先得了解下java语言,java是一种介于编译和解释的中间态(虽然java严格意义上属于编译型的),java在运行的过程中使用的是.class文件。
这种方式让java可以变得很灵活,所以反射这个方式应运而生。他可以非常的无敌,通过反射可以动态的将一个类对象创建出来,而不用使用传统的方式new出来。
通过反射可以读取到类中的每个方法,每个成员变量,甚至可以读取到私有变量和方法。
然后为了使用上的方便,我们会使用一种设计模式,单例模式,这个模式的好处是新建一个对象只需要一次,以后就再也不用new这个对象了,其实也可以理解成静态成员对象。有关设计模式我就不讲了,自己百度下。
最后注解的运行机制就是通过反射这个类,并动态的创建这个单例,所以这样注解后,运行就生效了。那么是谁来识别注解的呢,这个也是通过反射实现的,定义一个注解类的特征类
例如下面写法:
@DEMO
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public@interfaceDEMO{
}
这要java就能根据类上的注解动态实现功能了,是不是很神奇。
如果你还想了解更多这方面的信息,记得收藏关注本站。