1:Java Annotationsの紹介
発達には注釈がよく使用され、プロジェクトでカスタムアノテーションが表示されることがあります。今日は、注釈が何であるか、アノテーションのアプリケーションシナリオと注釈のカスタマイズ方法について説明しましょう。
以下には、開発における一般的な注釈がリストされています
@Override:この方法がスーパークラスから継承されることを特定するために使用されます。親クラスのメソッドが削除または変更された場合、コンパイラはエラーメッセージをプロンプトします(これは、最も頻繁に表示されるtoString()メソッドでいつでも表示できます)
@Deprecated:このクラスまたは方法は非推奨であり、期限切れになっていることを意味します。ユーザーが引き続き使用したい場合は、コンパイル警告が生成されます。
@suppresswarnings:無視のためのコンパイラ警告メッセージ
Junitテスト:@Test
春のいくつかの注釈:@Controller、@RequestMapping、@RequestParam、 @responseBody、@Service、@Component、@Repository、@Resource、@Autowire
Java検証の注釈:@notnull、@email
注釈のOverride.javaでルー山の本当の顔を見てみましょう
@target(elementType.Method)@retention(RetentionPolicy.Source)public @interface Override {} 2:Java Annotationの基本的な知識
1。Javaアノテーションデータ型
注釈は.javaファイルで記述され、@interfaceをキーワードとして使用するため、注釈もJavaのデータ型です。幅広い定義から、クラス、インターフェイス、列挙、および注釈はすべてクラスタイプです。
2。JavaMeta Annotation
注釈を作成するときは、いくつかの注釈を使用して、作成した注釈、つまり@interfaceに書かれた注釈を説明する必要があります。これらの注釈は、@target、@retentionなどのメタアノテーションと呼ばれます。ここにいくつかのメタアノテーションがあります
@documented:Javadocを生成するときに注釈が含まれているかどうかをマークするために使用されます。この注釈は@Overrideと同じであり、注釈は空で、何もないことがわかります。
@documented@retention(retentionPolicy.runtime)@target(elementType.annotation_type)public@interface document {}@Target:注釈を使用できる場所を定義するために使用されます。デフォルトでは、どこでも使用できます。または、使用範囲を指定できます。開発では、クラス(@controllerなど)、フィールド(@autowireなど)、メソッド(@requestmappingなど)、メソッドパラメーター(@requestparamなど)などで注釈を使用する方が一般的です。
タイプ:クラス、インターフェイス、または列挙宣言
フィールド:ドメイン(属性)宣言
方法:メソッド宣言
パラメーター:パラメーター宣言
コンストラクター:コンストラクターメソッド宣言
local_variable:ローカル変数宣言
annotation_type:コメントタイプ宣言
パッケージ:パッケージステートメント
Target.java
@documented@retention(retentionPolicy.runtime)@target(elementType.annotation_type)public @interfaceターゲット{ /** *アノテーションタイプ *を適用できる種類の要素の配列を返します。 * @returnアノテーションタイプの種類の要素の配列 *は */ elementType [] value();}に適用できます。 public enum elementType { /**クラス、インターフェイス(注釈タイプを含む)、または列挙宣言* /タイプ、 /**フィールド宣言(enum定数を含む)* /**メソッド宣言* /メソッド、 /**正式なパラメーター宣言* /パラメーター、 /**建設業者宣言* / */ annotation_type、/ **パッケージ宣言*/パッケージ、/ **パラメーター宣言*/ type_parameter、/ ** type*/ type_use}の使用}@Inherited:サブクラスが親クラスの注釈を継承し、反射を通じて親クラスの注釈を取得することができます。
@documented@retention(retentionPolicy.runtime)@target(elementtype.annotation_type)public @interface enselited {}@Constraint:属性値が合法かどうかを確認するために使用されます
@documented@target({elementType.annotation_type})@retention(retentionPolicy.runtime)public @interface constraint {class <? constraintvalidator <?、?>> [] validatedby();}@retention:注釈の宣言サイクルは、注釈のサバイバル段階を定義するために使用されます。ソースコードレベル、コンピレーションレベル(バイトコードレベル)、ランタイムレベルで生き残ることができます。
ソース:ソースコードレベル、注釈はソースコードにのみ存在し、一般にコンパイラとの対話に使用され、コードの検出に使用されます。 @override、@suppresswaringsなど。
クラス:ByteCodeレベル、ソースコードおよびByteCodeファイルに注釈が存在します。それらは主に、XML、Javaファイルなど、コンピレーション中に追加のファイルを生成するために使用されますが、実行時には取得することはできません。たとえば、MyBatisはエンティティとマッピングファイルを生成します。このレベルでは、JVMがロードされたときにプロキシ(Javaagent)を追加し、プロキシを使用してByteCodeファイルを動的に変更する必要があります。
ランタイム:ランタイムレベル、ソースコード、ByteCode、およびJava仮想マシンに注釈が存在します。それらは主にランタイムに使用され、リフレクションを使用して関連情報を取得できます。
@documented@retention(retentionPolicy.runtime)@target(elementType.annotation_type)public @interface retention { /***保持ポリシーを返します。 * @return保持ポリシー */ retentionPolicy value();} 3。Javaアノテーションの内容
上記の注釈ソースコードでは、一部の注釈にはコンテンツがなく、いくつかの注釈にコンテンツがあることがわかります。これは方法のようです。
注釈付きコンテンツの構文形式:データ型属性名()デフォルト値、データ型は属性のデータ型を記述するために使用されます。デフォルト値は、属性が割り当てられていない場合、デフォルト値が使用されることを意味します。一般に、文字列は空の文字列 ""をデフォルト値として使用し、通常、空の配列{}をデフォルト値として使用します。
springmvcでのリクエストマッピングの注釈の声明を見てみましょう
@target({elementType.Method、elementType.Type})@retention(retentionPolicy.runtime)@documented@mappingpublic @interface requestmapping {string name()default ""; @aliasfor( "path")string [] value()default {}; @aliasfor( "value")string [] path()default {}; RequestMethod [] Method()default {}; string [] params()default {}; string [] headers()default {}; string [] consumers()default {}; string []生成()default {};}springmvcでのrequestmappingアノテーションを使用します
@RequestMapping(value = "/list"、method = requestmethod.post、produces = {"application/json; charset = utf-8;"})public string list(){} 4.注釈のシナリオを使用します
注釈の宣言期間を通じて、注釈の使用シナリオを分析できます。
ソースソースコードレベル:@override、 @deprecatedなどのコンパイラの場合、開発者が使用すべき多くのシナリオはありません。
クラス:バイトコードレベル、この部分はめったに見られません
ランタイム:ランタイムレベル、これは最も一般的であり、開発者が使用するほとんどすべての注釈はランタイムレベルです。ランタイム注釈は、次の状況で一般的に使用されます
注釈に属性のない注釈。注釈のこの部分は通常、@Test、@before、@afterなどの注釈として役割を果たします。これらのタグ注釈を取得することにより、いくつかの論理処理が行われます。
Constraint Annotation @Constraintを使用して、@Email、@Notnullなどの属性値を確認できます。
注釈内のプロパティを使用して、いくつかのパラメーターを構成し、反射を使用してこれらのパラメーターを取得できます。これらの注釈には他の特別な機能はありません。XML構成の代わりにパラメーターを構成するだけです。アノテーションを使用してパラメーターを構成することは、@configurationなどのスプリングブーツで人気があります
構成方法XML対アノテーションに関して、通常、XMLを使用して、ビジネス関係にそれほど近くない構成を構成し、アノテーションを使用して、ビジネスに密接に関連するパラメーターを構成します。
3:Java Annotation and Reflection Basic API
//特定のタイプのアノテーションを取得<a ends annotation> a getAnnotation(class <a> annotationclass); //すべての注釈(親クラスに継承されたアノテーションを含む)を取得しますパブリックアノテーション[] getannotations(); //宣言された注釈を取得します(ただし、親クラスに継承されたアノテーションは含まれていません)public annotation [] getDeclaredAnnotations(); SecurityException; //特定のメソッドを取得するパブリックメソッドgetMethod(string name、class <?> ... parametertypes);
4:カスタムアノテーション
カスタムアノテーション +インターセプターまたはAOPSを使用して、アクセス許可を制御します。
次の例を使用して、インターフェイスにアクセスするときにユーザーがログインする必要があるアノテーションを定義するために使用されます。
ステップ1:注釈を定義します
requesslogin.java
@documented@target({elementtype.method})@retention(retentionPolicy.runtime)public @interface requireslogin {}ステップ2:注釈を使用します
@controller @requestmapping( "/user")public class usercontroller {@requireslogin @RequestMapping(value = "/list"、生産= {"application/json; charset = utf-8;"})public string getUserlist(){system.out.out.println( "---------------"); return "[{'id':1、 'username': 'zhangsan'}]"; }}ステップ3:AOPを使用して、注釈を傍受して解析する
public class loginadvices {public void before(joinpoint joinpoint)throws exception {object target = joinpoint.getTarget(); string methodname = joinpoint.getSignature()。getName(); System.out.println(ターゲット + "------" + methodname);メソッドメソッド=ターゲット.getClass()。getMethod(methodName); boolean annotationpresent = method.isannotationpresent(requireslogin.class); if(annotationpresent){//ユーザーはboolean islogin = falseをログインする必要があります。 if(!islogin){新しい例外をスロー( "このインターフェイスにアクセスするにはログインする必要があります"); } else {system.out.println( "login ..."); }}}}ApplicationContext.xmlでAOPを構成します
<bean id = "loginadvices"/> <! - aop configuration-> <aop:config proxy-target-class = "true"> <! - > <aop:aspect ref = "loginadvices"> <! - > <aop:aop:pointcut id = "pointcut1" expression = "実行( <! - 通知メソッドとポイント - > <aop:method = "before" pointcut-ref = "pointcut1"/> </aop:aspect> </aop:config>
カスタム例外
例外をカスタマイズする理由
Javaは、豊富な種類の例外処理クラスを提供しますが、プロジェクトではカスタムの例外がよく使用されます。主な理由は、Javaが提供する例外クラスが、場合によってはさまざまなビジネスのニーズをまだ満たすことができないことです。たとえば、システムの一部のエラーはJava構文に準拠していますが、ビジネスロジックに準拠していません。ユーザーがログインしたときにアカウントが存在しない場合、またはアカウントがロックされている場合、アカウントの例外アカウントエクセプトをカスタマイズできます。
または、場合によっては、Javaの同じ例外が複数の理由によって引き起こされる場合があります。問題のトラブルシューティング時にエラーを見つけるのは簡単ではありません。この時点で、より明確な例外のカスタマイズを使用できます。
カスタム例外の利点:カスタム例外は例外をより明確にし、根本的な例外を隠すことができます。これはより安全で直感的です。
カスタム例外の使用:カスタム例外は一般に、例外またはruntimeexceptionから継承されます。ビジネスニーズによれば、一部の属性はコンストラクターのパラメーターとしてとらえることができます。カスタムの例外では、プログラマーが例外を手動でスローし、例外を処理する必要があります。
以下は、apache shiroのカスタム例外の例です
パブリッククラスShiroExceptionはruntimeexceptionを拡張します{public shiroxception(){} public shiroxception(string message){super(message); } public shiroxception(スロー可能な原因){super(cause); } public shiroxception(string message、throwable bause){super(message、cause); }}上記は、Java AnnotationとCustom Annotationsの詳細な説明です