首页 > 编程知识 正文

java注解的实现原理,java泛型

时间:2023-05-06 05:33:11 阅读:33315 作者:3602

评论的概念和分类

1 .先看看评论是什么:

注释是注释类型的实例,可以对类进行注释。 这样,编译器在编译文档时,就会根据自己设置的方法编译类。

2 .评论分类

注释大致分为三种。 标记注释、常规注释、元注释和@override用于标识,该方法从超类继承。 这样,当超类的方法被修改时,实现类可以直接看到。 @deprecated注释表示不建议使用当前方法或类,如果用户仍在使用,将生成编译警告。

本文主要介绍了java定制评论,以下故事不多,我们一起来详细介绍一下

随着springboot的流行,以前用于基于xml的spring配置的越来越少,javaconfig格式的越来越多,如:

@configuration

公共类应用程序配置文件{

@bean(name='Hellobean ' ) )。

公共健康世界健康世界(

return new helloworldimpl (;

}

}

可见,它是基于包含springboot条目类* *应用程序的注释(annotation )实现的。

@configuration

@ components can (com.Alibaba.trade ) )。

@ enableautoconfiguration//(exclude={ pagehelperautoconfiguration.class } )

@servletcomponentscan

@enabletransactionmanagement

@enablediscoveryclient

@enablewebmvc

@ mappers can (com.Alibaba.trade.shared.mapper ) )。

publicclasstradeapplicationextendsspringbootservletinitializer {

publicstaticvoidmain (字符串[ ] args ) {

spring application.run (trade application.class,args );

}

}

java注释不仅减少了项目中的xml文件,便于维护,而且还简化了代码。 那么,在项目中如何阅读评论,如何发表自己的评论呢?

评论

java注释(也称为java标记)是一种特殊的语法元数据,java语言版本5.0现在支持添加到源代码中。 提供一种用于向代码中添加信息的形式化方法,以便在以后的某个时间点可以方便地使用这些数据。

可以标记java语言中的类、方法、变量、参数和包等。 与javadoc不同,java注释可以通过反射获取注释的内容。 编译器生成类文件时,可以将注释嵌入字节码中。 java虚拟机可以保留注释的内容,并在运行时获取注释的内容。

评论本身没有具体功能,它相当于标注,这个标注的具体作用和意义需要我们自己来实现。 一般来说,它会确定类或属性是否受此注释限定,然后通过反射检索注释属性以实现具体的业务功能。

内置注释

java定义了七组注释,三组位于java.lang,其余四组位于java.lang.annotation。

1、作用于代码的注释是

@override -检查此方法是否为重载方法。 如果找到其父类,或者引用的接口中没有方法,则会报告编译错误。

@deprecated -标记过时的方法。 使用此方法时,将报告编译警告。

@suppresswarnings -指示编译器忽略在注释中声明的警告。

2、作用于其他评论的评论(或元评论)为:

@retention -指示此注释是如何存储的、仅代码、内置于class文件中还是在运行时可以通过反射访问。

@documented -标记用户文档中是否包含这些注释。

@target -标记此注释应该是哪个java成员。

@inherited -标记此注释由哪个注释类继承。 默认注释不会被任何子类继承。

3、从java 7开始,添加了3个注释:

@safevarargs - java 7支持已开始。 忽略将参数用作通用变量的方法或构造函数调用发出的警告。

@functionalinterface - java 8支持已启动,标识了匿名函数或函数类型接口。

@repeatable - java 8开始支持,表示某个注释可以在同一声明中多次使用。

元评论

1,@retention

@保留注释指定标记注释

的存储方式:

retentionpolicy.source - 标记的注释仅保留在源级别中,并由编译器忽略。

retentionpolicy.class - 标记的注释在编译时由编译器保留,但java虚拟机(jvm)会忽略。

retentionpolicy.runtime - 标记的注释由jvm保留,因此运行时环境可以使用它。

2、@documented

@documented  注释表明,无论何时使用指定的注释,都应使用javadoc工具记录这些元素(默认情况下,注释不包含在javadoc中)。有关更多信息,请参阅 javadoc工具页面。

3、@target

@target  注释标记另一个注释,以限制可以应用注释的java元素类型。目标注释指定以下元素类型之一作为其值。

elementtype.type 可以应用于类的任何元素。

elementtype.field 可以应用于字段或属性。

elementtype.method 可以应用于方法级注释。

elementtype.parameter 可以应用于方法的参数。

elementtype.constructor 可以应用于构造函数。

elementtype.local_variable 可以应用于局部变量。

elementtype.annotation_type 可以应用于注释类型。

elementtype.package 可以应用于包声明。

elementtype.type_parameter

elementtype.type_use

4、@inherited

@inherited  注释表明注释类型可以从超类继承。当用户查询注释类型并且该类没有此类型的注释时,将查询类的超类以获取注释类型(默认情况下不是这样)。此注释仅适用于类声明。

5、@repeatable

repeatable java se 8中引入的,@repeatable注释表明标记的注释可以多次应用于相同的声明或类型使用(即可以重复在同一个类、方法、属性等上使用)。

自定义注解

java中自定义注解和创建一个接口相似,自定义注解的格式是以@interface为标志的。

@documented

@retention(retentionpolicy.runtime)

@target({elementtype.type})

public @interface spi {

/**

* default extension name

*/

string value() default "";

}

我们知道java.lang.annotation包中有一个annotation的接口,它是所有注解类型扩展的公共接口。那我们是否可以直接通过实现该接口来实现自定义注解呢?

import java.lang.annotation.annotation;

public class myannotation implements annotation {

@override

public class extends annotation> annotationtype() {

return null;

}

}

发现annotation接口中只有一个annotationtype的方法,而且通过annotation源码的注释我们可以发现答案是不能。

汉译即为:annotaion被所有注解类型继承,但是要注意:手动扩展继承此接口的接口不会定义注解类型。另请注意,此接口本身不定义注解类型。

使用场景

自定义注解的使用场景很多,我们在造轮子写框架的过程经常会使用到,例如我最近就遇到了一个业务场景:像一些编辑业务信息的接口,产品要求信息编辑后的新旧值对比,对比的业务功能,我们的实现方式是拿到前端填写的form表单(新值)和数据库中查询出来的dto(旧值)通过反射技术获取到相同属性字段名,再比较属性值就可以得出新旧值。得到值之后我们也知道该字段的dto中的字段名,但是如何将比较得到的新旧值字段的中文名返回给前端呢?例如:

public class stedent {

private string name;

private int age;

private string sex;

//省略setter,getter

}

比较后我们的结果是 name : “xiaoming “-> “daming”,age : 24 -> 26。但是我们不能直接将name和age返回给前端,他们需要的格式是:姓名: “xiaoming “-> “daming”,年龄 : 24 -> 26。这时候就可以考虑自定义一个注解@fieldname,

@deprecated

@documented

@retention(retentionpolicy.runtime)

@target(elementtype.field)

public @interface fieldname {

string value() default "";

}

然后将该注解加在属性字段上面

public class student {

@fieldname(value = "姓名")

private string name;

@fieldname(value = "年龄")

private int age;

@fieldname(value = "性别")

private string sex;

//省略setter,getter

}

之后就可以通过反射获取该字段中文名。

// 如果 oldfield 属性值与 newfield 属性值的内容不相同

if (!isempty(newvalue)) {

map map = new hashmap<>();

string newfieldname = newfield.getname();

if (newfield.isannotationpresent(apimodelproperty.class)) {

apimodelproperty apimodelpropertyanno = newfield.getannotation(apimodelproperty.class);

newfieldname = apimodelpropertyanno.value();

else if (newfield.isannotationpresent(fieldname.class)) {

fieldname fieldnameanno = newfield.getannotation(fieldname.class);

newfieldname = fieldnameanno.name();

}

map.put(field_name, newfieldname);

map.put(old_value, oldvalue);

map.put(new_value, newvalue);

list.add(map);

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对萬仟网的支持。

希望与广大网友互动??

点此进行留言吧!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。