今天看了下有关java注解的视频学习资料在。做点笔记:
学java注解的目的:
能看别人代码,特别是框架代码。由于肯定与注解有关。
编程更简洁,代码清晰。
java注解是java1.5引入的:注解概念是java提供的一种原程序中的元素关联不论什么信息和元数据的途径和方法。
常见注解(编译时注解);
@override:方法覆盖了它的父类的方法
@Deprecated:这个凝视是一个标记凝视。
所谓标记凝视。就是在源程序中增加这个标记后,并不影响程序的编译。但有时编译器会显示一些警告信息。
或者在方法名上加一横线,意思是建议不使用
@SuppressWarnings(""):对代码中变量或方法的警告提示,也是想告诉该方法存在潜在风险等。
注解分类:
依照执行机制分类:
1,源代码注解:注解仅仅在源代码中存在 ,编译成.class文件就不存在了。
2,编译时注解:在源代码和.class中都存在
3。执行时注解:在执行阶段才会起作用的注解,甚至会影响执行逻辑的注解。
依照来源分类:
1。来自JDK的注解:
2。来自第三方的注解:
3。我们自定义的注解:
另外一类叫元注解:对注解的注解。
常见第三方注解:
Spring中的@Autowired @Service @Repository等
Mybatis中的@InsertProvider @UpdateProvider @Options等
自己定义注解:
以@interface +注解名
如定论了一个名为Description注解:
@Target({ ElementType.METHOD, ElementType.TYPE }) //@Targe指注解的作用域,包含METHOD方法声明,TYPE类接口,PARAMETER參数声明。PACKAGE包声明,LOCAL_VARIABLE局部变量声明,FIELD字段声明及CONSTRUCTOR构造方法声明
@Retention(RetentionPolicy.RUNTIME) //@Retenion指生命周期:1。源代码注解:注解仅仅在源代码中存在 。编译成.class文件就不存在了。2,编译时注解:在源代码和.class中都存在3,执行时注解:在执行阶段才会起作用的注解,甚至会影响执行逻辑的注解。
@Inherited //@Inherited指同意子类继承
@Documented//@Documented生成java doc时包括注解信息
//以上4行为元注解
public @interface Description {
/*注解中的成员类型是受限制的:合法的类(int double等)包含原始类型及String,Class,Annotation,Enumeration等
* 假设注解仅仅有一个成员。则成员名必须取名为value(),在使用注解时能够忽略成员名和赋值符号(=)
* 注解类能够没有成员。没有成员的注解称为标识注解****/
String desc();//注解中的成员(成员变量)以无參无异常方式声明
String author();
int age() default 18;//能够用default为成员指定一个默认值
}
以下是一个对注解进行操作的小样例:
@Description(author = "child", desc = "在Child上的类注解") //使用注解:使用注解语法 :@<注解名>(成员名1=值1,成员名2=值2.....)多个成员用逗号分隔,依据@Target指定的使用范围来使用
public class Child{
@Description(author = "ldm", desc = "在Child的name()方法注解")
public String name() {
// TODO Auto-generated method stub
return null;
}
@Description(author = "child", desc = "Child中number()方法注解")
public String number() {
return "100";
}
}
public static void main(String[] args) {
// 首先使用类载入器载入类
try {
Class c = Class.forName("com.ldm.test.Child");
// 找到类上面的注解
boolean isExist = c.isAnnotationPresent(Description.class);// 推断注解是否存在
if (isExist) {
// 拿到注解实例
Description d = (Description) c.getAnnotation(Description.class);
System.out.println(d.desc());
}
//找到方法上的注解
Method[] ms=c.getMethods();
for (Method m : ms) {
boolean isMExist = m.isAnnotationPresent(Description.class);// 推断注解是否存在
if(isMExist){
// 拿到注解实例
Description d = (Description) m.getAnnotation(Description.class);
System.out.println(d.desc());
}
}
/**********************************************/
//第二种解析方法
for (Method m : ms) {
Annotation []as=m.getAnnotations();
for (Annotation a : as) {
if(a instanceof Description){
Description d=(Description) a;
System.out.println(d.desc());
}
}
}
}
catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
----------------控制台打印结果------------------------------------------
在Child上的类注解
在Child的name()方法注解
Child中number()方法注解
在Child的name()方法注解
Child中number()方法注解