在java中,我们在使用的过程中,常常能够用到注解,例如:
@Override
@FunctionalInterface(0
@SuppressWarnings
这些注解的作用就是为了注释说明 ,这也包含一些可以加在其他注解上的注解 ,这些我们就称为元注解:
元注解名 | 说明 |
---|---|
@Target | 指定了注解能在哪里使用 |
@Retention | 保留时间(生命周期) |
@Inherited | 表示修饰的自定义注解可以被子类继承 |
@Documented | 表示该自定义注解,会出现在API文档里面 |
下面我们来具体的看一下每个元注解的具体的参数
@Target
- ElementType.FIELD:成员变量
- ElementType.TYPE,类
- ElementType.METHOD,方法
- ElementType.PARMETER,用来 描述参数
@Retention - RententionPolicy.RUNTIME(常用):运行阶段
- RententionPolicy.CLASS:编译阶段
- RententionPolicy.SOURCE:源码阶段
下面开始正题:
1.首先先定义一个注解,用元注解来约束
//作用范围为类上
@Target(ElementType.TYPE)
//生命周期是在运行期间
@Retention(RetentionPolicy.RUNTIME)
public @interface ContentPath2 {
//相当于抽象方法用来约束
public String path();
public String value();
}
然后定义一个类,用刚写好的注解来约束,使用户只关注参数,而不用再关注具体的实现,从而达到了简化开发!
//文件输出的路径与文件名,还有输出的文件中的内容是什么
@ContentPath2(path = "C:\\Users\\单少宝宝\\Desktop\\a.txt",value = "我一个新文档")
public class WriterContent {
}
最后这个就是用反射合拿到指定类是否有ContentPath2这个注解的修饰,若有就拿到对就的path与value,用流写入到指定文件中就可以了!这一步一般由框架的开发人员开发好了,只留出接口,让程序员进行二次开发!提高开发的速度!
public class WriterUtil2 {
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName("com.test.demo.WriterContent");
//当前的class类文件中是否包含COntentPath2这个类
if (clazz.isAnnotationPresent(ContentPath2.class)){
ContentPath2 annotation = clazz.getAnnotation(ContentPath2.class);
String path = annotation.path();
String value = annotation.value();
FileWriter fw = new FileWriter(new File(path));
fw.write(value);
fw.close();
}
}
}
总结 :
这样我们就实现了自定义注解 !