繁体   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