亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何故意導致自定義Java編譯器警告消息?

如何故意導致自定義Java編譯器警告消息?

幕布斯6054654 2019-11-25 11:10:08
我將提交一個丑陋的臨時hack,以解決阻塞問題,同時我們等待固定外部資源。除了用一個可怕的注釋和一堆FIXME標記它之外,我還希望編譯器拋出明顯的警告消息作為提醒,所以我們不要忘記將其刪除。例如,類似:[javac] com.foo.Hacky.java:192: warning: FIXME temporary hack to work around library bug, remove me when library is fixed!有沒有一種方法可以通過選擇的消息引起故意的編譯器警告?失敗了,最容易添加到代碼中以引發現有警告的東西是什么,可能是在違規行上的字符串中顯示了一條消息,以便將其打印在警告消息中?編輯:不推薦使用的標簽似乎對我沒有任何幫助:/** * @deprecated "Temporary hack to work around remote server quirks" */@Deprecatedprivate void doSomeHackyStuff() { ... }在eclipse中或從sun javac 1.6(從ant腳本運行)中,沒有編譯器或運行時錯誤,并且肯定是在執行該功能。
查看完整描述

3 回答

?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

我見過的一種技術是將其與單元測試聯系起來(您進行單元測試,對嗎?)。基本上,您創建一個單元測試,一旦實現外部資源修復,該單元測試就會失敗。然后,您對該單元測試發表評論,以告訴其他人,一旦問題解決,如何撤消您的陳舊駭客。

這種方法真正令人眼前一亮的是,撤消黑客的誘因是對核心問題本身的修復。


查看完整回答
反對 回復 2019-11-25
?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

我認為將由編譯器處理的自定義批注是解決方案。我經常編寫自定義批注以在運行時執行操作,但是我從未嘗試在編譯時使用它們。因此,我只能為您提供可能需要的工具的指導:


編寫自定義注釋類型。本頁說明如何編寫注釋。

編寫注釋處理器,處理您的自定義注釋以發出警告。運行此類注釋處理器的工具稱為APT。您可以在此頁面上找到介紹。我認為您需要在APT API中使用AnnotationProcessorEnvironment,它可以讓您發出警告。

從Java 6開始,APT已集成到javac中。也就是說,您可以在javac命令行中添加注釋處理器。javac手冊的這一部分將告訴您如何調用自定義注釋處理器。

我不知道這種解決方案是否切實可行。我會在有空的時候嘗試自己實現它。


編輯


我成功實現了我的解決方案。另外,我使用了Java的服務提供商功能來簡化其使用。實際上,我的解決方案是一個jar,其中包含2個類:自定義注釋和注釋處理器。要使用它,只需將此jar添加到項目的類路徑中,然后注釋任何內容即可!就在我的IDE(NetBeans)內部,這工作正常。


注釋代碼:


package fr.barjak.hack;


import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;


@Retention(RetentionPolicy.SOURCE)

@Target({ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.METHOD, ElementType.PACKAGE, ElementType.PARAMETER, ElementType.TYPE})

public @interface Hack {


}

處理器代碼:


package fr.barjak.hack_processor;


import java.util.Set;

import javax.annotation.processing.AbstractProcessor;

import javax.annotation.processing.ProcessingEnvironment;

import javax.annotation.processing.RoundEnvironment;

import javax.annotation.processing.SupportedAnnotationTypes;

import javax.lang.model.element.Element;

import javax.lang.model.element.TypeElement;

import javax.tools.Diagnostic.Kind;


@SupportedAnnotationTypes("fr.barjak.hack.Hack")

public class Processor extends AbstractProcessor {


    private ProcessingEnvironment env;


    @Override

    public synchronized void init(ProcessingEnvironment pe) {

        this.env = pe;

    }


    @Override

    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {

        if (!roundEnv.processingOver()) {

            for (TypeElement te : annotations) {

                final Set< ? extends Element> elts = roundEnv.getElementsAnnotatedWith(te);

                for (Element elt : elts) {

                    env.getMessager().printMessage(Kind.WARNING,

                            String.format("%s : thou shalt not hack %s", roundEnv.getRootElements(), elt),

                            elt);

                }

            }

        }

        return true;

    }


}

要將生成的jar作為服務提供者啟用,請在jar中添加文件META-INF/services/javax.annotation.processing.Processor。此文件是acsii文件,必須包含以下文本:


fr.barjak.hack_processor.Processor


查看完整回答
反對 回復 2019-11-25
?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

一些快速且不太臟的方法可能是使用@SuppressWarnings帶有故意錯誤String參數的注釋:


@SuppressWarnings("FIXME: this is a hack and should be fixed.")

這將生成警告,因為編譯器未將其識別為特定的警告,以禁止執行以下操作:


不支持的@SuppressWarnings(“ FIXME:這是一個hack,應該修復?!保?/p>


查看完整回答
反對 回復 2019-11-25
  • 3 回答
  • 0 關注
  • 837 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號