创建一个注解接口
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
public abstract String name() default "";// 默认值为“”
}
@Target是注解类型
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
第二步
用Java反射写一个工具类读取注解
public class AnUtils {
public static void getFruitInfo(Class<?> clazz){
String strFruitName=" 水果名称:";
Field[] fields = clazz.getDeclaredFields();
//@Target=FIELD 运行
for(Field field :fields){
if(field.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
// //@Target=TYPE 运行
if(clazz.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
}
第三步
写个测试类
在 @Target=TYPE时
@Fruit(name="123")
public class AnnotionTest {
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
输出: 水果名称:123
在 @Target=FIELD时
public class AnnotionTest {
@Fruit(name="123")
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
第一步
创建一个注解接口
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
public abstract String name() default "";// 默认值为“”
}
@Target是注解类型
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
第二步
用Java反射写一个工具类读取注解
public class AnUtils {
public static void getFruitInfo(Class<?> clazz){
String strFruitName=" 水果名称:";
Field[] fields = clazz.getDeclaredFields();
//@Target=FIELD 运行
for(Field field :fields){
if(field.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
// //@Target=TYPE 运行
if(clazz.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
}
第三步
写个测试类
在 @Target=TYPE时
@Fruit(name="123")
public class AnnotionTest {
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
输出: 水果名称:123
在 @Target=FIELD时
public class AnnotionTest {
@Fruit(name="123")
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
创建一个注解接口
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
public abstract String name() default "";// 默认值为“”
}
@Target是注解类型
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
第二步
用Java反射写一个工具类读取注解
public class AnUtils {
public static void getFruitInfo(Class<?> clazz){
String strFruitName=" 水果名称:";
Field[] fields = clazz.getDeclaredFields();
//@Target=FIELD 运行
for(Field field :fields){
if(field.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
// //@Target=TYPE 运行
if(clazz.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
}
第三步
写个测试类
在 @Target=TYPE时
@Fruit(name="123")
public class AnnotionTest {
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
输出: 水果名称:123
在 @Target=FIELD时
public class AnnotionTest {
@Fruit(name="123")
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}第一步
创建一个注解接口
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
public abstract String name() default "";// 默认值为“”
}
@Target是注解类型
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
第二步
用Java反射写一个工具类读取注解
public class AnUtils {
public static void getFruitInfo(Class<?> clazz){
String strFruitName=" 水果名称:";
Field[] fields = clazz.getDeclaredFields();
//@Target=FIELD 运行
for(Field field :fields){
if(field.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
// //@Target=TYPE 运行
if(clazz.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
}
第三步
写个测试类
在 @Target=TYPE时
@Fruit(name="123")
public class AnnotionTest {
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
输出: 水果名称:123
在 @Target=FIELD时
public class AnnotionTest {
@Fruit(name="123")
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
输出: 水果名称:123