2012-09-04 88 views
12

我想在java中爲DirtyChecking創建自定義註釋。就像我想比較使用此註釋的兩個字符串值,並在比較後它將返回一個boolean值。如何在java中創建自定義註釋?

例如:我會把@DirtyCheck("newValue","oldValue")超過屬性。

想我做的接口:

public @interface DirtyCheck { 
    String newValue(); 
    String oldValue(); 
} 

我的問題是

  1. 如果我做一個類來創建用於兩個字符串值比較的方法?我的意思是,這個註解是如何通知我必須調用這個方法的?
  2. 如何檢索此方法的返回值?
+0

,你可以更好地闡述你所追求的?你想讓編譯器識別該註釋嗎?或IDE?或者你正在使用什麼特定的框架? –

+0

據我可以從[oracle的網站](http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html)閱讀,你不能使註釋有方法/功能。它們旨在存儲元數據值或可以識別其用途的數據。 –

+0

我正在添加一個鏈接[來自Oracle的自定義註釋](http://www.oracle.com/technetwork/articles/hunter-meta-2-098036。html) – AurA

回答

17

首先,您需要標記註釋是否用於類,字段或方法。比方說,這是方法:所以你寫在你的註釋定義:

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface DirtyCheck { 
    String newValue(); 
    String oldValue(); 
} 

接下來你必須寫假設DirtyChecker類將使用反射來檢查方法有註釋,並做了一些工作,例如說,如果oldValuenewValue是相等的:

final class DirtyChecker { 

    public boolean process(Object instance) { 
     Class<?> clazz = instance.getClass(); 
     for (Method m : clazz.getDeclaredMethods()) { 
      if (m.isAnnotationPresent(DirtyCheck.class)) { 
       DirtyCheck annotation = m.getAnnotation(DirtyCheck.class); 
       String newVal = annotation.newValue(); 
       String oldVal = annotation.oldValue(); 
       return newVal.equals(oldVal); 
      } 
     } 
     return false; 
    } 
} 

乾杯, 米哈爾

+0

感謝米哈爾你的時間和回答我有一些疑問,如 1-讓我們假設我有註釋@DirtyCheck(newValue,OldValue) 現在我想告訴我的開發人員使用它,因此可能開發人員將使用在它們的Set方法和註解中只有這個Annotation語法會返回True或False,以便開發人員知道值是否相同。 – psisodia

+0

@psisodia我沒有聽到你的想法,你能提供一個例子嗎? – Michal

+0

假設我創建了一個註解@DirtyCheck(newValue,oldValue)及其類DirtyChecker.java 當我在我的應用程序中使用此註釋時,如 @DirtyCheck(「hello」,「hi」) public boolean compare() { ... mycode ... } 我想知道這個註解是如何引用我在DirtyChecker.java中給出的方法 – psisodia

2

要回答你的第二個問題:你的註釋不能返回一個值。處理您的註釋的類可以對您的對象進行操作。例如,這通常用於記錄。 我不確定是否使用註釋來檢查對象是否髒是有意義的,除非您想在這種情況下拋出異常或通知某種DirtyHandler

對於你的第一個問題:你真的可以花費一些努力找到你自己。在這裏有足夠的信息在計算器和網絡上。

1

CustomAnnotation.java

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

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface CustomAnnotation { 
    int studentAge() default 21; 
    String studentName(); 
    String stuAddress(); 
    String stuStream() default "CS"; 
} 

如何使用註釋領域在Java中?

TestCustomAnnotation.java

package annotations; 
import java.lang.reflect.Method; 
public class TestCustomAnnotation { 
    public static void main(String[] args) { 
      new TestCustomAnnotation().testAnnotation(); 
    } 
    @CustomAnnotation(
       studentName="Rajesh", 
       stuAddress="Mathura, India" 
    ) 
    public void testAnnotation() { 
      try { 
       Class<? extends TestCustomAnnotation> cls = this.getClass(); 
       Method method = cls.getMethod("testAnnotation"); 

       CustomAnnotation myAnno = method.getAnnotation(CustomAnnotation.class); 

       System.out.println("Name: "+myAnno.studentName()); 
       System.out.println("Address: "+myAnno.stuAddress()); 
       System.out.println("Age: "+myAnno.studentAge()); 
       System.out.println("Stream: "+myAnno.stuStream()); 

      } catch (NoSuchMethodException e) { 
      } 
    } 
} 
Output: 
Name: Rajesh 
Address: Mathura, India 
Age: 21 
Stream: CS 

Reference

相關問題