java 注解处理器(AbstractProcessor) 获取到 指定注解的属性值 javapoet 如何使用这个值生成类

java 注解处理器(AbstractProcessor) 获取到 指定注解的属性值 javapoet 如何使用这个值生成类,第1张

定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK15及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

Java注解相当于对类或者方法或者变量额外的注释(标识)。以下是转载

-------------------------------------------------------

Annotation是Java5、6只后的新特征(中文称之为注解),并且越来越多的得到了应用,比如Spring、Hibernate3、Struts2、iBatis3、JPA、JUnit等等都得到了广泛应用,通过使用注解,代码的灵活性大大提高。

这些都是使用别人定义的注解,一般注解的使用都是在一些基础框架或者类库中来定义的,因此很少见过有人自己去写一个注解出来并使用在程序中,因此注解的使用常常给人感觉很神秘,这就为你揭开注解的面纱。

注解的神秘之处在于:通过类似注释的方式,可以控制程序的一些行为,运行时的状态,可以为成员赋值,做配置信息等等,与常规编码思维大相径庭。

只用别人定义好的注解是搞不懂这些问题的,要想真正知道注解内部的秘密,要自己定义注解,然后在程序中获取注解信息,拿到注解信息后,就可以为我所用了。

下面我简单演示下三类注解的用法:类注解、方法注解、字段(也称之域)注解的定义与适用,并看看如何获取注解的信息。

一、定义注解

package lavasoftanntest;

import javalangannotationElementType;

import javalangannotationRetention;

import javalangannotationRetentionPolicy;

import javalangannotationTarget;

/

类注解

@author leizhimin 2009-12-18 14:15:46

/

@Retention(RetentionPolicyRUNTIME)

@Target(ElementTypeTYPE)

public @interface MyAnnotation4Class {

public String msg();

}

package lavasoftanntest;

import javalangannotationElementType;

import javalangannotationRetention;

import javalangannotationRetentionPolicy;

import javalangannotationTarget;

/

方法注解

@author leizhimin 2009-12-18 14:16:05

/

@Retention(RetentionPolicyRUNTIME)

@Target(ElementTypeMETHOD)

public @interface MyAnnotation4Method {

public String msg1();

public String msg2();

}

package lavasoftanntest;

import javalangannotationElementType;

import javalangannotationRetention;

import javalangannotationRetentionPolicy;

import javalangannotationTarget;

/

字段注解

@author leizhimin 2009-12-18 15:23:12

/

@Retention(RetentionPolicyRUNTIME)

@Target(ElementTypeFIELD)

public @interface MyAnnotation4Field {

public String commont();

public boolean request();

}

二、写一个类,用上这些注解

package lavasoftanntest;

/

一个普通的Java类

/

@MyAnnotation4Class(msg = "测试类注解信息")

class TestClass {

@MyAnnotation4Field(commont = "成员变量的注解信息", request = true)

private String testfield;

@MyAnnotation4Method(msg1 = "测试方法注解信息1", msg2 = "测试方法注解信息2")

public void testMethod() {

Systemoutprintln("Hello World!");

}

}

三、测试注解

为了使用注解,需要通过反射获取注解的对象。通过注解对象来 *** 作注解信息。

package lavasoftanntest;

import javalangreflectField;

import javalangreflectMethod;

/

测试类

@author leizhimin 2009-12-18 14:13:02

/

public class TestOptAnnotation {

public static void main(String[] args) throws NoSuchMethodException, NoSuchFieldException {

TestClass t = new TestClass();

Systemoutprintln("-----------MyAnnotation4Class注解信息---------");

MyAnnotation4Class an4clazz = tgetClass()getAnnotation(MyAnnotation4Classclass);

Systemoutprintln(an4clazzmsg());

Systemoutprintln("-----------MyAnnotation4Method注解信息---------");

Method method = tgetClass()getMethod("testMethod", new Class[0]);

MyAnnotation4Method an4method = methodgetAnnotation(MyAnnotation4Methodclass);

Systemoutprintln(an4methodmsg1());

Systemoutprintln(an4methodmsg2());

Systemoutprintln("-----------MyAnnotation4Field注解信息---------");

Field field = tgetClass()getDeclaredField("testfield");

MyAnnotation4Field an4field = fieldgetAnnotation(MyAnnotation4Fieldclass);

Systemoutprintln(an4fieldcommont());

Systemoutprintln(an4fieldrequest());

}

}

运行结果:

-----------MyAnnotation4Class注解信息---------

测试类注解信息

-----------MyAnnotation4Method注解信息---------

测试方法注解信息1

测试方法注解信息2

-----------MyAnnotation4Field注解信息---------

成员变量的注解信息

true

Process finished with exit code 0

四、总结

看完上面的测试过程,Annotation已经不再神秘了,这里总结下自定义注解的使用方法:

1、自定义注解,注意注解的时空范围,简单说就是注解针对的目标(类、方法、字段),以及注解的时效(运行时、或者源码中有效)。

2、要获取注解的信息,必须通过Java的反射技术来获取Annotation对象,因为你除此之外没有别的获取注解对象的方法。

3、获取了注解对象,就可以调用注解的方法来获取相对应的值了。为基础框架所用。

4、当然,注解也可以没有定义成员,这样注解就成了一个标记符号了。

对于局部变量的注解只能在源码级别上进行处理,类文件并不描述局部变量。因此,所有的局部变量注解在编译完一个类的时候就会被遗弃掉。同样地,对包的注解不能在源码级别之外存在。

在文件package-infojava中注解一个包,该文件只包含以注解先导的包声明

包注解需要在特定文件:package-infojava,中添加,获取如下:

Package pkg = TestAnnotationclassgetPackage();

boolean hasAnnotation=pkgisAnnotationPresent(Xpcclass);

if (hasAnnotation){

    Xpc xpc=pkggetAnnotation(Xpcclass);

    Systemoutprintln("package:" + pkggetName());

    Systemoutprintln("id=" + xpcid());

    Systemoutprintln("name=" + xpcname());

    Systemoutprintln("gid=" + xpcgid());

}

以上就是关于java 注解处理器(AbstractProcessor) 获取到 指定注解的属性值 javapoet 如何使用这个值生成类全部的内容,包括:java 注解处理器(AbstractProcessor) 获取到 指定注解的属性值 javapoet 如何使用这个值生成类、java 注解都有哪些东西、java元注解,局部注解怎么解析等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10181638.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存