自定义Annotation需要使用@interface进行标记,同时也可以使用@Target定义Annotation的范围。
1、字定义Annotation的例子:
package com.mydemo;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
// 获取指定方法
Method method = Message.class.getDeclaredMethod("send", String.class);
// 获取指定的Annotation
DefaultAnnotation defaultAnnotation = method.getAnnotation(DefaultAnnotation.class);
// 消息内容
String msg = defaultAnnotation.value() + "[" + defaultAnnotation.url() + "]";
// String msg = defaultAnnotation.value() + defaultAnnotation.title() + "[" + defaultAnnotation.url() + "]";
method.invoke(Message.class.getDeclaredConstructor().newInstance(), msg);
}
}
@Target({ElementType.TYPE, ElementType.METHOD}) // 此Annotation只能用在类和方法上
@Retention(RetentionPolicy.RUNTIME)
// 定义Annotation的运行策略
// 自定义的Annotation
@interface DefaultAnnotation {
/**
* value属性名称是系统内定名称,所以在进行内容设置时就可以不屑属性名称直接设置
* 即:@DefaultAnnotation("百度")
* 等价于:@DefaultAnnotation(value = "百度")
*
* @return
*/
public String value(); // 获取数据
// public String title(); // 获取数据
public String url() default "www.baidu.com"; // 获取数据,提供有默认值
}
class Message {
// 方法上使用Annotation
@DefaultAnnotation("百度")
// @DefaultAnnotation(value = "百度",title = "测试测试")
public void send(String msg) {
System.out.println("【消息发送】------" + msg);
}
}
运行结果:
【消息发送】------百度[www.baidu.com]