詳細説明

ここに画像の説明を挿入

コメント

基本的な知識ポイント:

コンセプト

アノテーション(注釈としても知られる)、メタデータ
の種別コードレベルの記述
があるJDK1.5以降の導入特性、及びクラスインタフェース列挙が同じレベルにあり
、それは内で宣言することができるパッケージクラスフィールドメソッドローカル変数メソッドパラメータなどの前部は
これらの要素の説明コメントに使用されます

フォーマット

@interface 注解名{}

役割

  • コンパイルチェック
  • 代替構成ファイル
  • 注釈の定義(メタ注釈:注釈の注釈)

:私たちが学ぶ前に、まあ、実際に私たちはしばしば、3つの音後に見られる、コメントのために非常に精通していない
3、共通のコメント

  • @Override:
    このメソッドが分類から継承されることを宣言し、コンパイル時のチェックを実行します
  • @SuppressWarnings:
    警告を抑制
    多くの値があり、1つすべてを知っていれば十分です(つまり、すべての警告を抑制します
  • @ 非推奨
    このメソッドが非推奨であることを宣言します

フレームワークの私たちの追跡調査時には、フレームワークは、多くの表示されますカスタム注釈を
そう、今、私が説明するようになったカスタムアノテーションを

カスタムアノテーション:

カスタム注釈実際、難しい何もない、我々は単に理解したい二つのことをうまく- プロパティメタアノテーション

注釈付き属性:

コンセプト

ノートは本質的であるインタフェース
あなたが使用することができてjavap、このコマンドの逆コンパイル注釈付きに関するバイトコードファイルの
かもしれインターフェースを一定にし、抽象メソッド
抽象メソッド注釈それが呼ばれている注釈のプロパティ

アノテーションプロパティでサポートされるタイプ

  • 8つの基本型(byte、boolean、char、short、int、float、long、double)
  • ストリング
  • クラス
  • 注釈
  • 列挙型:列挙
  • 上記のタイプに対応する1次元配列

ノートたらプロパティを持つ
注釈を使用して、必要なときに割り当て(注釈プロパティがない限り、デフォルト値を持っています

フォーマット

public @interface 注解名 {
	属性类型1 属性名1();	//注解的属性,前面的public abstract可以省略
	属性类型2 属性名2() default 属性的默认值; //使用时可以不赋值
	...
}

そこで、カスタムアノテーションのプロパティを表示します。

public @interface MyAnnotation {
	public abstract String name(); //注解的属性,前面的public abstract 可以省略
	int age();  //前面的数据类型,不是所有类型都支持
}

だから、カスタムアノテーションは唯一の属性は、十分ではありません
また、あなたがその制限するためにメタアノテーションを必要とする範囲をして時間を実行しています

メタ注釈:

メタ注釈は主に4つ分かれています。

  • @Retentionアノテーション
    共通アノテーションのランタイムを制限します
  • @Target Annotation
    共通の注釈の使用を制限します
  • @Documentedアノテーション
    説明ドキュメントを生成し、クラスの説明を追加します
  • @Inheritedアノテーション
    サブクラスが親クラスのアノテーションを継承できるようにします

上記の私の説明では、私たちは知ることができます:

メタアノテーションの場合、カスタムアノテーションでは通常、最初の2つ
つまり@Retentionアノテーション@Targetアノテーションのみが適用されます
(ただし、これは他の2つが後者の2つのメタアノテーションを使用しないことを意味するものではありません)

そこで、ここでは@Retentionアノテーション@Targetアノテーションのについて説明ます
Value

  • @Retention注
    SOURCE - ソース状態の実行
    - CLASS コンパイル済みのクラスファイルを実行する
    ランタイムを- 実行実行
    (私たちは、一般的に値が最も長い時間のための効果的な注釈を確保するために、RUNTIMEです)
  • @Target注
    TYPE -へのクラス(タイプ)注意事項
    分野-に、フィールドノート、フィールドが対象であってもよいし、忘れてはいけない
    - METHOD メソッドノート
    に- PARAMETER パラメータの注釈
    に-コンストラクタコンストラクタコメント
    LOCAL_VARIABLE - ローカル変数のコメント
    ANNOTATION_TYPE -への注釈付きのノート
    へ-パッケージパッケージのコメント

だから、今私はカスタムアノテーションを表示します

package edu.youzg.about_annotation.core;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Retention(RUNTIME)
@Target({ METHOD, PARAMETER })
public @interface MyAnnotation {
	public abstract String name();
	int age() default 666;
}

そこで、カスタムアノテーションの使用方法を示します。

package edu.youzg.about_annotation.core;

import java.lang.reflect.Method;

public class Demo {
	
	@MyAnnotation(name="youzg")
	public static void doSomeThing() throws NoSuchMethodException, SecurityException {
		Class<?> klass = Demo.class;
		Method method = klass.getMethod("doSomeThing");
		MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
		String name = annotation.name();
		int age = annotation.age();
		System.out.println(name + age);
	}
	

	public static void main(String[] args) {
		try {
			doSomeThing();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
	}
	
}

ここで、操作の結果を示します。
実行結果表示


そこで、アノテーションを使用して、前に説明したJDBCツールを変更します。

小文字のJDBCツール:

まず、メモをさせてください。

package edu.youzg.about_annotation.core;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Retention(RUNTIME)
@Target({ METHOD})
public @interface JDBCAnnotation {
	String driverClass() default "com.mysql.jdbc.Driver";
	String url() default "jdbc:mysql://localhost:3306/dbstudy";
	String user() default "root";
	String password() default "123456";
}

ここで、アノテーション設定JDBCツールを示します。

package edu.youzg.about_annotation.core;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBCUtils {
	
	 @JDBCAnnotation(password = "123456")
	 public static Connection getConnection() throws NoSuchMethodException, ClassNotFoundException, SQLException {
		 //获取该类的字节码文件对象
		 Class klass= JDBCUtils.class;
		 //获取方法对象
		 Method m = klass.getMethod("getConnection");
		 //判断该方法上是否有注解,如果有获取到注解
		 boolean b = m.isAnnotationPresent(JDBCAnnotation.class);//参数:是注解的Class类型
		 if (b) { //如果方法上有注解,获取注解,并拿到注解的属性值
			 JDBCAnnotation annotation = m.getAnnotation(JDBCAnnotation.class);
			 //获取注解属性的值
			 String driverClass = annotation.driverClass();
			 String url = annotation.url();
			 String user = annotation.user();
			 String password = annotation.password();
			 Class.forName(driverClass);
			 return DriverManager.getConnection(url,user,password);
		 }
		 return null;
	 }
	 
}

ここで、テストクラスを示します。

package edu.youzg.about_annotation.core;

import java.sql.Connection;
import java.sql.SQLException;

public class Demo {
	
	public static void main(String[] args) throws NoSuchMethodException, ClassNotFoundException, SQLException {
		Connection connection = JDBCUtils.getConnection();
        System.out.println(connection);
	}
	
}

そこで、操作の結果を表示します。
実行結果表示


おすすめ

転載: www.cnblogs.com/codderYouzg/p/12746409.html