java获取注解的值

java获取注解的值,第1张

很多朋友都想知道java怎么获取注解的值?下面就一起来了解一下吧~

1、定义一个注解,用于给全局变量field字段赋值

package comhahastudyannotationvalue; import javalangannotationDocumented; import javalangannotationElementType; import javalangannotationRetention; import javalangannotationRetentionPolicy; import javalangannotationTarget; /  description: 定义一个注解,用于给 全局变量 field 字段 赋值,并使用反射取值。 

 特别提醒: @Rentention(RetentionPolicyRUNTIME) 时,注解才会被jvm加载,才能使用反射获取。  @version v10  @author w  @date 2018年8月1日下午2:37:40 / @Documented @Retention(RetentionPolicyRUNTIME) @Target(value=ElementTypeFIELD) public @interface Fields { int sort() default 0 ; String value() ; }

2、创建一个普通的类,使用 @ConsAnnotation、@Fields 注解

package comhahastudyannotationvalue; /  description: 创建一个普通的类,使用 @ConsAnnotation、@Fields 注解。  @version v10  @author w  @date 2018年8月1日下午2:50:23 / @ConsAnnotation(request = { "hello","world","annotation!" }) public class User { @Fields("中华人民共和国") private String userName; public String getUserName() { return userName; } public void setUserName(String userName) { thisuserName = userName; } }

3、针对 comhahastudyannotationvalueUser 类使用注解的测试

package comhahastudyannotationvalue; import javalangreflectField; import javautilArrays; /  description: 针对 comhahastudyannotationvalueUser 类使用注解的测试  @version v10  @author w  @date 2018年8月1日下午2:37:13 / public class ValueTest { public static void main(String[] args) throws Exception { User user = new User(); // 1、 获取 User类上的注解 @ConsAnnotation ConsAnnotation anno = usergetClass()getAnnotation(ConsAnnotationclass); String[] arr = annorequest(); Systemoutprintln(ArraystoString(arr)); // [hello, world, annotation!] // 2、 获取User类中 private String userName; 变量上的注解 @Field Field f = usergetClass()getDeclaredField("userName"); Fields anno2 = fgetAnnotation(Fieldsclass); usersetUserName(anno2value()); Systemoutprintln(usergetUserName()); // 中华人民共和国 } }

一、从注解中获取

使用注解方式,我们需要自定义一个注解,在注解中指定参数名,然后通过反射机制,获取方法参数上的注解,从而获取到相应的注解信息。这里自定义的注解是Param,通过value参数指定参数名,定义了一个工具类ParameterNameUtils来获取指定方法的参数名列表,这里获取测试类ParameterNameTest中定义的方法method1的参数名列表表,下面是具体的代码。

1、从功能使用上,没任何本质的区别。

2、两者从spring的实现方式上,则有很大的区别:

注解方式实例化bean,是通过底层框架反射的方式实现,不需要在配置文件中声明任何的bean,只需开启扫描注解功能即可。注解方式耦合度较高,而且反射也会影响效率,不过底层框架已经优化得很好,优点就是编码相对少而简洁;

传统配置的方式则是要在spring的配置文件中按name或id属性配置化实体bean,优点是这个方式耦合度相对较低,相对较直观,缺点就是编码较多,每声明一个实例都要代码获取一遍,且配置文件也要配置,这样会由于过多的bean配置而导致配置文件变得臃肿,维护也不易。

有问题欢迎提问,,谢谢!

通过bring程序获取。

最近项目中遇到一个业务场景,就是在Spring容器启动后获取所有的Bean中实现了一个特定接口的对象,第一个想到的ApplicationContextAware,在setApplicationContext中去通过ctx获取所有的bean。

后来发现好像逻辑不对,这个方法不是在所有bean初始化完成后实现的,后来试了一下看看有没有什么Listener之类的,发现了好东西ApplicationListener,然后百度一下ApplicationListener用法。

既然是基于spring,可以这样:

ResourcePatternResolver rpr = new PathMatchingResourcePatternResolver();

Resource[] res = rprgetResources("classpath: /class"); // classpath:带号会找jar中的class

然后根据resource取clas路径就行

String className = res[0]getURL()getPath();

className = classNamesplit("(classes/)|(!/)")[1];

className = classNamereplace("/", "")replace("class", "");

Object obj = ClassforName(className);

话说我最近也在写一个这样的MVC。。要不咱两合伙? 我写的也是基于注解,不过要支持REST风格

属于重点,在系统中用到注解权限时非常有用,可以精确控制权限的粒度

注意:要想使用反射去读取注解,必须将Retention的值选为Runtime Java代码import javalangannotationAnnotation;import javalangreflectMethod;//读取注解信息public class ReadAnnotationInfoTest {    public static void main(String[] args) throws Exception {        // 测试AnnotationTest类,得到此类的类对象        Class c = ClassforName(comiwtxokhtdannotationAnnotationTest);        // 获取该类所有声明的方法        Method[] methods = cgetDeclaredMethods();        // 声明注解集合        Annotation[] annotations;        // 遍历所有的方法得到各方法上面的注解信息        for (Method method : methods) {            // 获取每个方法上面所声明的所有注解信息            annotations = methodgetDeclaredAnnotations();            // 再遍历所有的注解,打印其基本信息            Systemoutprintln(methodgetName());            for (Annotation an : annotations) {                Systemoutprintln(方法名为: + methodgetName() + 其上面的注解为: + anannotationType()getSimpleName());                Method[] meths = anannotationType()getDeclaredMethods();                // 遍历每个注解的所有变量                for (Method meth : meths) {                    Systemoutprintln(注解的变量名为: + methgetName());                }            }        }    }}

我没看过代码。但是要实现这个也不难:

通过反射知道了对象一共有哪些注解,装在一个 Map 中,

然后通过 Map 反过来,再通过注解找对象。

以上就是关于java获取注解的值全部的内容,包括:java获取注解的值、Java如何获取方法参数中的名称、一个采用注解方式,一个采用从spring框架中获取方式,这两种方法有何区别吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/10174869.html

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

发表评论

登录后才能评论

评论列表(0条)

保存