Java和大数据系列
注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hive Flume等等~写的都是纯干货,各种顶会的论文解读,一起进步。
今天和大家分享一下Java通过反射自定义注解案例
#博学谷IT学习技术支持#
前言
Java中反射和自定义注解都是Java中非常重要的技术栈,对新手来说非常抽象,不好理解,今天主要是把这两个技术栈串起来,写个小案例,方便大家理解
一、注解是什么?
注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。
二、元注解是什么?
元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:
@Target,
@Retention,
@Documented,
@Inherited
下面我们看一下每个元注解的作用和相应分参数的使用说明。
@Target
表明该注解可以应用的java元素类型:
@Retention
表明该注解的生命周期
@Document
表明该注解标记的元素可以被Javadoc 或类似的工具文档化。
@Inherited
表明使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解。
三、自定义注解
修饰符: 访问修饰符必须为public,不写默认为pubic;
关键字: 关键字为@interface;
注解名称: 注解名称为自定义注解的名称,使用时还会用到;
注解内容: 注解中内容,对注解的描述。
1.定义自定义注解
代码如下(示例):
package pack07;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface Book {
String value();
double price() default 100;
String[] authors() default {"xxx"};
}
这里自定义一个Book注解,可以应用在类和方法上,生命周期定义为RUNTIME,定义3个注解变量,其中2个是有default。
2.使用自定义注解
代码如下(示例):
package pack07;
class Demo{
@Book(value = "xxx")
public void show1(){
System.out.println("我是show1方法!");
}
@Book(value = "yyy")
public void show2(){
System.out.println("我是show2方法!");
}
public void show3(){
System.out.println("我是show3方法!");
}
}
写一个非常简单的Demo类,定义3个方法show1,show2,show3,其中show1和show2使用注解,但是给定的注解变量value值不同,而show3方法没有使用注解
3.通过反射测试自定义注解
代码如下(示例):
package pack07;
import java.lang.reflect.Method;
public class TestDemo {
public static void main(String[] args) throws Exception {
//获取类的class对象
Class<?> clazz = Class.forName("pack07.Demo");
Object object =clazz.newInstance();
//获取类中所有的方法
Method[] methods = clazz.getDeclaredMethods();
//遍历所有方法
for (Method method : methods) {
boolean bl = method.isAnnotationPresent(Book.class);
if (bl){
System.out.println(method.getName()+"方法加了book注解");
System.out.println("-----------------------------");
//判断注解的value是否是yyy
Book bookAnno = method.getAnnotation(Book.class);
String value = bookAnno.value();
if ("yyy".equals(value)){
System.out.println(method.getName()+"方法加了book注解,且value值为yyy");
method.invoke(object);
System.out.println("-----------------------------");
}
}
else {
System.out.println(method.getName()+"方法没加book注解");
}
}
}
}
1.通过反射得到Demo类中所有的方法
2.对所有方法进行遍历操作
3.判断该方法是否添加book注解
4.判断该方法是否添加value变量为yyy的注解
5.最终通过method.invoke(object)调用该方法
总结
本文通过一个简单案例,将反射和自定义注解串起来,帮助大家更好的理解反射和自定义注解,两个相对抽象的java技术栈,希望对大家有所帮助。