JDK注釈の使用とカスタム注釈の方法を例を挙げて説明する。
JDKの3つの基本的な注釈
a、@Override:検査子類は確かに親を覆う方法です。
b、@Deprecated:説明はもう古いです。
c、@Suppres Warnings(\"unused"、"deprection"):プログラム中の警告を抑制します。unused警告のタイプ。{}行列allはすべての警告を抑制する。
簡単な使い方: 1.基本タイプ 2.String 3.列挙の種類 4.注釈タイプ 5.クラスタイプ 6.上記のタイプの1次元配列タイプ 具体的にはどのように定義されていますか?コードを見ます。
注解の反射:(魂)
私達は模擬して@Test注解の機能を実現します。
まずこれは私達の注釈です。@MyTest
デフォルトのカスタムコメントはコンパイル期間にのみ生存します。クラスの段階です。
上のカスタムコメントは@Retension注釈を適用しています。この注釈はカスタム注釈の生存範囲を変更することです。
この注釈は元注ともいい、注釈にしか使えない注を元注といいます。
上記のmethod方法はタイムアウトの問題を考慮していません。以下に改善します。
以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。もっと知りたいなら、下のリンクを見てください。
a、@Override:検査子類は確かに親を覆う方法です。
b、@Deprecated:説明はもう古いです。
c、@Suppres Warnings(\"unused"、"deprection"):プログラム中の警告を抑制します。unused警告のタイプ。{}行列allはすべての警告を抑制する。
簡単な使い方:
public class Demo1 {
//@SuppressWarnings({ "deprecation", "unused" })
@SuppressWarnings("all")
public void fun()
{
int i = 5;
System.out.println("hello");
System.out.println(new Date().toLocaleString());
}
}
class Tests extends Demo1
{
@Override
public void fun()
{
super.fun();
}
@Deprecated
public void tt()
{
System.out.println(new Date().toLocaleString());
}
}
一つの注釈@interfaceコメント名を宣言します。
public @interface MyAnnotation{}
その本質はインターフェースです。このインターフェースはAnnotationインターフェースを継承する必要があります。
public interface MyAnnotation extends java.lang.annotation.Annotation {
}
コメントの属性タイプ:
public @interface MyAnno1 {
//
int age() default 20;
String[] name() default "hehe";
String value() default "haha";
Love love();
//MyAnno2 anno();
//public static final int num = 5;//
//public abstract void fun();//error
}
カスタムコメントを使う:
public class Demo2 {
//@MyAnno1(age=25,name={"jack","lucy"},value="zhengzhi")
//@MyAnno1(value="zhengzhi")
@MyAnno1(value="zhengzhi",love=Love.eat)
public void tests()
{
}
}
デフォルトがない場合は、カスタムコメントを使用してコメントのプロパティの値を設定する必要があります。注解の反射:(魂)
Junit @Test
a、
java.lang.reflect.AnnotatedElement:
<T extends Annotation> T getAnnotation(Class<T> annotationType): 。 null。
Annotation[] getAnnotations(): , 。
Annotation[] getDeclaredAnnotations(): 。
boolean isAnnotationPresent(Class<? extends Annotation> annotationType): 。
Class、Method、Field、Constructor AnnotatedElement .
:Class.isAnnotationPresent(MyTest.class): @MyTest ;
Method.isAnnotationPresent(MyTest.class): @MyTest 。
コードで以下を実現します。私達は模擬して@Test注解の機能を実現します。
まずこれは私達の注釈です。@MyTest
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
// :
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
long timeout() default Integer.MAX_VALUE;//
}
これは私たちが注釈を使っているクラスです。
public class DBCRUD {
@MyTest(timeout=1000000)
public void addTest()
{
System.out.println("addTest ");
}
@MyTest
public void updateTest()
{
System.out.println("updateTest ");
}
}
注を使用すると、このクラスが注解を使用しているかどうかを判定する必要があります。反射によって実現します。
private static void method1() throws IllegalAccessException,
InvocationTargetException, InstantiationException {
Class claz = DBCRUD.class;//
//
Method[] methods = claz.getMethods();
for(Method m:methods){
// @MyTest
// boolean boo = m.isAnnotationPresent(MyTest.class);
// System.out.println(m.getName()+"===="+boo);// false CLASS, RUNTIME
if(m.isAnnotationPresent(MyTest.class)){
m.invoke(claz.newInstance(), null);
}
}
}
ここで注意したいのは、ユーザー定義の注釈の生存範囲を考慮する必要があるということです。デフォルトのカスタムコメントはコンパイル期間にのみ生存します。クラスの段階です。
上のカスタムコメントは@Retension注釈を適用しています。この注釈はカスタム注釈の生存範囲を変更することです。
この注釈は元注ともいい、注釈にしか使えない注を元注といいます。
上記のmethod方法はタイムアウトの問題を考慮していません。以下に改善します。
//method1();
//
Class claz = DBCRUD.class;
Method[] methods = claz.getMethods();
for(Method m:methods){
// MyTest
MyTest mt = m.getAnnotation(MyTest.class);
if(mt!=null){
//
long out = mt.timeout();
long start = System.nanoTime();
m.invoke(claz.newInstance(), null);
long end = System.nanoTime();
if((end-start)>out)
{
System.out.println(" ");
}
}
}
締め括りをつける以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。もっと知りたいなら、下のリンクを見てください。