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 获取所有带注解的类等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)