如何使Java注释有用

时间:2016-05-20 17:05:05

标签: java annotations

在我正在处理的项目中,我希望有一个自定义注释,警告用户应该从另一个线程调用此特定方法。我称之为@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);
        }
    }

2 个答案:

答案 0 :(得分:1)

GUI Effect Checker可能会满足您的需求。以下内容取自its documentation

最常见的GUI相关错误之一是无效的UI更新或无效的线程访问:直接从后台线程访问UI。

GUI效果检查器解决了这个问题。 GUI Effect Checker确保只有UI线程访问UI对象。这可以防止GUI错误,例如无效的UI更新和无效的线程访问。

程序员注释每个方法以指示是否:

  • 它不访问任何UI元素(并且可以在任何线程上运行);据说这种方法具有“安全效果”。
  • 它可以访问UI元素(并且必须在UI线程上运行);据说这种方法具有“UI效应”。

在编译时,GUI效果检查器在以下情况下发出错误:

  • @UIEffect方法由@SafeEffect方法调用。
  • 方法声明违反了子类型限制:超类型声明了@SafeEffect方法,子类型将覆盖版本注释为@UIEffect。

答案 1 :(得分:1)

为了在编译源代码时处理注释,您应该编写注释处理器并指示javac使用它们。

以下是某种教程:https://www.javacodegeeks.com/2015/09/java-annotation-processors.html

虽然我不确定您是否可以在编译时检测到提到的线程问题。