通过注解和反射实现一个简单的@Value注解

通过注解和反射实现一个简单的@Value注解,第1张

Java注解(Annotation)就是一种java标注,并且能够携带数据, 是在JDK50被引入的。

Java的注解可以标注Java语言中的类、变量、方法、参数、包等等。

值得注意的是: 上面所说的Java注解只是一种标注,所以注解需要配合反射来使用才能发挥出强大作用。

注解的成员变量只支持 八种基本数据类型(byte、short、int、long、float、double、char、boolean)、String、Class、Enum、Annotation

还有的就是,所有的注解都是Annotation接口的实现类,可以把Annotation接口看成是所有注解的超类

上面就是定义了一个可以标注在类或者注解以及方法上的,保留到运行期的注解。 但是也仅仅是定义了一个注解而已,一个注解要发挥它自己的作用,还需要反射的配合。

反射是java中的一种机制,通过这种机制我们能够在运行时获取到一个类的一切信息(继承的类、实现的接口、属性、方法等), 以及注解信息和注解所携带的数据

通过获取到的类信息,我们可以构造一个新的对象、获取到某个对象的属性值、执行某个对象的方法等。

定义value注解

定义pojo User类

测试并使用注解

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

在文件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());

}

既然是基于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风格

import javalangannotationRetention;

import javalangannotationRetentionPolicy;

import javalangreflectInvocationTargetException;

import javalangreflectMethod;

@Retention(RetentionPolicyRUNTIME)

@interface GetView {

String Method();

String Value();

}

public class Temp {

@GetView(Method = "aa", Value = "bb")

public void test() {

Systemoutprintln("In test method");

}

public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException {

Temp temp = new Temp();

Method method = tempgetClass()getMethod("test");

Systemoutprintln(methodisAnnotationPresent(GetViewclass));

methodinvoke(temp);

GetView view = methodgetAnnotation(GetViewclass);

Systemoutprintln(viewMethod());

Systemoutprintln(viewValue());

}

}

以上就是关于通过注解和反射实现一个简单的@Value注解全部的内容,包括:通过注解和反射实现一个简单的@Value注解、java元注解,局部注解怎么解析、java 获取所有带注解的类等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存