注解

自定义注解
package com.xiye.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Create by xiye on 2019/12/10 15:19
*/
@Retention(RetentionPolicy.RUNTIME) // RUNTIME:表示运行(JVM)也能保留注解、CLASS:编译后也能保留,但是JVM中就没有保留、SOURCE:只在代码中保留,编译后和JVM都没有保留
@Target({ElementType.METHOD, ElementType.FIELD}) // 元注解,指明使用注解位置,TYPE:类前、FIELD:字段前、METHOD:方法前、CONSTRUCTOR:构造器前
public @interface Book {
/*
* 属性的类型只能是八大基本类型
* 或者String、Class、枚举类型
* */
String name();
double price() default 9.9;
String[] authors();
}
注解实用类
package com.xiye.bean;
import com.xiye.annotation.Book;
/**
* Create by xiye on 2019/12/10 15:40
*/
public class BookShelf {
// 注解中只有单属性时,可以不写属性名
// 有默认值的属性可以不写,取默认值
@Book(name = "Java同行记", authors = {"xiye", "hb"})
public void show() {
System.out.println("注解对应方法一");
}
@Book(name = "Python同行记", authors = {"xiye", "hb"})
public void show1() {
System.out.println("注解对应方法二");
}
@Book(name = "Hadoop同行记", authors = {"xiye", "hb"})
public void show2() {
System.out.println("注解对应方法三");
}
}
import com.xiye.annotation.Book;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
* Create by xiye on 2019/12/10 15:54
*/
public class Demo1_注解 {
/*
* 元注解:
* @Retention(RetentionPolicy.RUNTIME)
* 定义该注解的生命周期(有效范围)。RUNTIME:表示运行(JVM)也能保留注解、CLASS:编译后也能保留,但是JVM中就没有保留、
* SOURCE:只在代码中保留,编译后和JVM都没有保留
* @Target({ElementType.METHOD, ElementType.FIELD})
* 指明在什么位置使用,写默认是任何地方都可以使用:TYPE:类前、FIELD:字段前、METHOD:方法前、CONSTRUCTOR:构造器前
* 允许多位置使用,使用数组指明使用位置即可
*
*
* */
public static void main(String[] args) throws Exception {
Class<?> aClass = Class.forName("com.xiye.bean.BookShelf");
Method show = aClass.getMethod("show");
if (show.isAnnotationPresent(Book.class)) {
Book book = show.getAnnotation(Book.class);
System.out.println(book.name() + ", " + book.price() + " " + Arrays.toString(book.authors()));
}
Object obj = aClass.newInstance();
Method[] methods = aClass.getMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(Book.class)) {
method.invoke(obj);
}
}
}
}
本文详细介绍了自定义注解的创建与使用,包括注解的生命周期、应用位置及如何通过反射读取注解信息,展示了注解在Java编程中的灵活性与实用性。

被折叠的 条评论
为什么被折叠?



