Java 基本內置 annotation
@Override
@Deprecated
@SuppressWarnings
@SuppressWarnings是抑制警告的意思,這個注解主要的用處就是忽略警告信息
常見的警告值
具體實例
public class Test {
//定義了一個不建議使用了方法
@Deprecated
public void sayHello() {
System.out.println("Hello");
}
//聲明以下的方法,自動忽略deprecation和unused的警告,不要在console上報出warn
//以下的方法使用了被Deprecated的方法sayHello
//也沒有使用到一個被定義的變量 i
//但是因為設置了警告忽略所以不會有warning
@SuppressWarnings({"deprecation", "unused"})
public static void main(String[] args) {
int i;
Test test = new Test();
test.sayHello();
}
}
@FunctionallInterface
Java 1.8新增的注解,用於約定函數式接口
函數式接口存在的意義,主要是配合Lambda表達式來使用
//匿名實現類 new Function<Integer, String> 實現了Function接口
List<Integer> intList = Lists.newArrayList(1, 2, 3);
List<String> stringList = Lists.transform(intList, new com.google.common.base.Function<Integer, String>() {
@Override
public String apply(Integer input) {
return input + "aa";
}
});
//可以轉換成下面的lambda表達式
List<Integer> intList = Lists.newArrayList(1, 2, 3);
List<String> stringList = Lists.transform(intList, input -> input + "aa");
使用 @FunctionallInterface 自定義函數式接口
//自定義一個函數式接口,並且只有一個public的抽象方法
@FunctionalInterface
public interface MyFunction {
public String myApply();
}
//定義一個類,讓這個類去使用 MyFunction
public class Hello {
void say(MyFunction myFunction) {
System.out.println(myFunction.myApply());
}
}
public class MainTest {
public static void main(String[] args) {
Hello hello = new Hello();
//輸出 Hello World
hello.say(new MyFunction() {
@Override
public String myApply() {
return "Hello World";
}
});
//可以轉換為以下的lambda表達式,同樣輸出 Hello World
hello.say(() -> "Hello World");
}
}
自定義新的 annotation
使用元注解(meta annotation)來設定一個注解的作用,可以說他是 “自定義注解” 的注解
元注解的種類
注解參數的數據類型
注解參數
default
來自定義某個參數的默認值default
設定,這時使用此注解時可以不用打參數值,例如 @GetMapping("/")具體實例
如何使用一個自定義的注解
//自定義注解 MyAnnotaion,使用 @interface 定義他是一個注解
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@interface MyAnnotation {
String[] value();
String comment() default "hello";
}
//使用自定義的注解 MyAnnotation,並給value值"John"
@MyAnnotation("John")
class MyTest {
public static void test(){
//透過反射取得某個類上的某個注解
MyAnnotation config = MyTest.class.getAnnotation(MyAnnotation.class);
System.out.println("value: " + config.value() + ", comment: " + config.comment());
}
}
public class Main{
public static void main(String[] args) {
MyTest.test(); //輸出 value: John, comment: hello
}
}
使用 @Repeatable 元注解
public class FindFiles{
//此注解接住 FileType 注解,並把它存起來
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FileTypes {
FileType[] value();
}
//自定義的注解,可以想像成是一個自定義的對象,裡面有很多成員變量
//使用 @Repeatable 讓這個注解可以被重複使用
//並且 @Repeatable 還指定這個 FileType 注解要放到 FileTypes 注解裡
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(FileTypes.class)
public @interface FileType {
String value();
String comment();
}
@FileType(value=".java", comment="java")
@FileType(value=".html", comment="html")
@FileType(value=".css", comment="css")
public void work() throws Exception {
//透過反射取得類,並取得work方法,然後再work方法上的FileType注解們
FileType[] fileTypes = this.getClass().getMethod("work").getAnnotationsByType(FileType.class);
for (FileType fileType : fileTypes) {
System.out.println("value: " + fileType.value() + ", comment: " + fileType.comment());
}
}
public static void main(String[] args) throws Exception {
new FindFiles().work();
}
}
//輸出
value: .java, comment: java
value: .html, comment: html
value: .css, comment: css