簡體   English   中英

如何使Java注釋有用

[英]How To Make Java Annotations Useful

在我正在研究的項目中,我想有一個自定義批注,該批注警告用戶應從另一個線程調用此特定方法。 我已經將其稱為@ThreadNeeded ,並且我想達到的效果是,如果調用的方法在主線程上,則使編譯器警告用戶。 我該如何實現? 我研究了許多有關注釋的指南,但是除了僅用注釋標記ElementType之外,它們中沒有一個真正提供了使用它們的方法。 這是我到目前為止的注釋來源

/**
 * An annotation that signifies that this method needs to be run inside a background thread.
 */
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.METHOD)
public @interface ThreadNeeded {

}

這是一個示例用法

    @Nullable
    @ThreadNeeded
    public SonyCamera build(){
        try {
            send();
        } catch (Exception ex){
            Log.e(TAG, ex.getMessage(), ex);
            return null;
        }
        return camera;
    }

    private void send() throws Exception {
        final byte[] ssdpreqb = SSDP_REQUEST.getBytes();
        DatagramSocket socket;
        DatagramPacket recieve, packet;
        socket = new DatagramSocket();
        InetSocketAddress isad = new InetSocketAddress(SSDP_ADDRESS, SSDP_PORT);
        packet = new DatagramPacket(ssdpreqb, ssdpreqb.length, isad);
        socket.send(packet);
        Thread.sleep(100);
        socket.send(packet);
        Thread.sleep(100);
        socket.send(packet);

        boolean searching = true;
        byte[] array = new byte[1024];
        while(searching) {
            recieve = new DatagramPacket(array, array.length);
            socket.setSoTimeout(SSDP_TIMEOUT);
            socket.receive(recieve);
            String replyMessage = new String(recieve.getData(), 0, recieve.getLength(), "UTF-8");
            String ddusn = SSDPClient.findParamaterValue(replyMessage, "USN");
            String location = SSDPClient.findParamaterValue(replyMessage, "LOCATION");
            camera.location = location;
            camera.usn = ddusn;
            fetch(location);
        }
    }

GUI效果檢查器可能會做您需要的事情。 以下摘自其文檔

與GUI相關的最普遍的錯誤之一是無效的UI更新或無效的線程訪問:直接從后台線程訪問UI。

GUI效果檢查器解決了此問題。 GUI效果檢查器可確保只有UI線程才能訪問UI對象。 這樣可以防止GUI錯誤,例如無效的UI更新和無效的線程訪問。

程序員注釋每個方法以指示是否:

  • 它不訪問UI元素(並且可以在任何線程上運行); 據說這種方法具有“安全作用”。
  • 它可以訪問UI元素(並且必須在UI線程上運行); 據說這種方法具有“ UI效果”。

在以下情況下,在編譯時,GUI Effect Checker會發出錯誤:

  • @UIEffect方法由@SafeEffect方法調用。
  • 方法聲明違反了子類型限制:一個超類型聲明一個@SafeEffect方法,一個子類型將覆蓋版本注釋為@UIEffect。

為了在編譯源代碼時處理注釋,您應該編寫注釋處理器並指示javac使用它們。

這是某種類型的教程: https : //www.javacodegeeks.com/2015/09/java-annotation-processors.html

盡管我不確定您能否在編譯時檢測到提到的線程問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM