注解
注解
解释
- 注解不同于注释,注释是给开发者看的,便于更加方便的理解程序,注解是给JVM识别的。
- 所有的Java类都是Object的子类
- 所有的Annotation都是java.lang.annotation.Annotation的子类
- Annotation通常作用于pagkage、Class、Field、Method上面
JDK 提供的几个特俗的Annotation,称为元Annotation,只能用在Annotation上面。
常用注解
- @ Target (jdk提供)
表示定义的注解作用在哪里
* ElementType.TYPE:class、interface、Enum 类、接口、枚举
* ElementType.Field:Field 字段
* ElementType.Method:Method 方法 - Retention
表示注解的保留策略
* RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
* RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
* RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
示例:
Column
//注解放到字段上面
@Target(ElementType.TYPE)
//运行时保留,可以通过反射获取
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
public String name() default "jack";
public String value();
public String address() default "";
}
User.java
@Column(name = "zhangsan" ,value = "12",address = "北京市")
public class User {
public static void Say(String name,String value,String address)
{
System.out.println("name:"+name+" --value:"+value+"--address:"+address);
}
}
main
public static void main(String [] args)
{
User user=new User();
Class<? extends User> aClass = user.getClass();
Column annotation = aClass.getAnnotation(Column.class);
if(annotation!=null) {
try {
String address = annotation.address();
String name = annotation.name();
String value = annotation.value();
Method say = aClass.getMethod("Say", String.class, String.class, String.class);
say.invoke(user,name,value,address);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}