注分析:注釈は、プロパティの値を取得します
反射技術を使用して:java.lang.reflect.AnnotatedElementインタフェース
:インタフェース実装クラス反射
たAccessibleObject、クラス、コンストラクタ、フィールド,,方法,,パッケージ
抽象メソッドを:
ブールisAnnotationPresent(クラスannotationClass)が
決定指定されたタイプ(コンストラクタ、クラス、メソッド...)注釈が指定され含むかどうかで
:パラメータ
クラスannotationClasを:クラスの送信は、注釈ファイルオブジェクトを指定し、何の注釈ブックが存在しない場合に判断したい、Book.classの渡された
戻り値を:
ブール:指定された注釈を含むが、trueを返し、注釈リターン指定されていませんfalseに
T getAnnotation(クラスannotationClass)が
取得し、指定されたタイプ(コンストラクタ、クラス、メソッド...)注釈
:パラメータ
クラスannotationClassを:ファイル転送クラスのアノテーションを指定します。ブックの注釈を取得したい、Book.classの渡し
戻り値:
T:リターンを指定されていることは、注釈
の注釈が存在しない場合、nullを返します
使用のメタアノテーション:
package com.ccc.demo08Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.TYPE})//声明注解的使用位置:成员方法上,类/接口上
@Retention(RetentionPolicy.RUNTIME)//声明注解的声明周期(.java,.class,运行后的内存中)
public @interface Book {
//书名
public abstract String value();
//价格,默认值为 100
public abstract double price() default 100;
//多位作者
public abstract String[] authors();
}
:(注釈の分析要素解析法、注釈パーサクラスの注釈)
package com.ccc.demo08Annotation;
import com.itheima.demo05Annotation.MyAnnotation01;
import com.itheima.demo05Annotation.MyAnnotation03;
import org.junit.Test;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Arrays;
@Book(value = "三国演义",price = 88,authors = "罗贯中")
public class ParseAnnotation {
@Book(value = "水浒传",authors = "施耐庵")
@MyAnnotation03("aaa")
public void method(){}
以下のための分析方法についての注意
分析:
- クラスファイルオブジェクトの現在のクラス(ParseAnnotation)を取得します
- 現在のクラスのメソッドのすべてのメンバーを取得し、メソッドの配列を返します。
- アレイを介して、それぞれ、メソッドオブジェクトを取得します
- 指定されたメソッド帳の注釈があるかどうか、メソッドisAnnotationPresentオブジェクトの決意を使用
- この方法は、getAnnotationにブックの注意を得るための指定された方法を使用して、ブックのアノテーションを指定した場合
- 注釈のプロパティ値を取得します)(注釈名属性名を使用します
@Test
public void getAnnotationMethod() throws ClassNotFoundException {
//1.获取当前类ParseAnnotation的class文件对象
Class clazz = Class.forName("com.itheima.demo08Annotation.ParseAnnotation");
//2.获取当前类中的所有成员方法,返回一个Method数组
//Method[] methods = clazz.getMethods();
Method[] methods = clazz.getDeclaredMethods();
//3.遍历数组,获取每一个Method对象
for (Method m : methods) {
//System.out.println(m.getName()+"-->"+m.isAnnotationPresent(Book.class));
//4.使用Method对象中的方法isAnnotationPresent判断,方法上是否有指定的Book注解
if(m.isAnnotationPresent(Book.class)){
//5.如果方法指定的Book注解,使用getAnnotation获取方法上指定的Book注解
Book book = m.getAnnotation(Book.class);
//6.使用注解名.属性名()获取注解的属性值
System.out.println(book.value());
System.out.println(book.price());
System.out.println(Arrays.toString(book.authors()));
}
}
}
クラスの分析ノート
分析:
- クラスファイルオブジェクトの現在のクラス(ParseAnnotation)を取得します
- isAnnotationPresentは、クラスが指定された注釈ブックを持っているかどうかを判断し使用します
- 書籍の注釈は、ブックノートを取得するgetAnnotationメソッドが使用している場合
- 注釈name属性名()を使用し、プロパティ値の注釈を取得
@Test
public void getAnnotationClass(){
//1.获取当前类ParseAnnotation的class文件对象
Class clazz = ParseAnnotation.class;
//2.使用isAnnotationPresent判断类上是否有指定的Book注解
boolean b = clazz.isAnnotationPresent(Book.class);
//System.out.println(b);
//3.如果有Book注解,使用getAnnotation方法获取到Book注解
if(b){
//Annotation是所有接口的父接口,而Annotation没有book类型的属性,
//所以得向下转型为book类型
Book book = (Book)clazz.getAnnotation(Book.class);
//4.使用注解名.属性名(),获取注解的属性值
String value = book.value();
System.out.println(value);
double price = book.price();
System.out.println(price);
String[] authors = book.authors();
System.out.println(Arrays.toString(authors));
}
}
}