私はあなたが希望しているのかを推測しているが、
public void callFoo(Class<?> clazz)
のような方法を有することであり、あなたがclazz
の方法public static void foo()
を持っていることを確認したいなど、コマンドラインフラグである可能性があります。
私はこれについてしばらく考えていましたが、心に浮かぶ技術はどれもあなたをそこに連れてこないでしょう。 AnnotationProcessor
を使用すると、特定の注釈で注釈を付けられたクラスに特定のメソッドがあるかどうかを確認できます(そうでない場合はコンパイルエラーが発生します)。ただし、コンパイル時にClass
引数が渡されるようにする方法はありませんcallFoo(Class<?> clazz)
には注釈が付いています。ここで
が中途半端そこにあなたを取得AnnotationProcessorです:
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Messager;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic;
@SupportedSourceVersion(SourceVersion.RELEASE_6)
@SupportedAnnotationTypes("so.Foo")
public class FooAnnotationProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
TypeElement foo = processingEnv.getElementUtils().getTypeElement("so.Foo");
Set<? extends Element> classes = roundEnv.getElementsAnnotatedWith(foo);
Messager messenger = processingEnv.getMessager();
for (Element e : classes) {
boolean found = false;
for (Element method : e.getEnclosedElements()) {
messenger.printMessage(Diagnostic.Kind.ERROR,
method.getSimpleName());
if (method.getKind() == ElementKind.METHOD && method.getSimpleName().toString().equals("getInstance")) {
found = true;
break;
}
}
if (!found)
{
messenger.printMessage(Diagnostic.Kind.ERROR,
"The following class does not implement getInstance : " + e.getSimpleName(),e);
}
}
return true;
}
}
最終的に、私はあなたを示唆してどちらかの静的メソッドを使用する必要はありませんので、それは実行時に強制何かしたり、再設計あなたのコードであることをできるようになります。
しかし、私はあなたがこれと一緒に行くところが好奇妙です。おそらくもっと簡単な方法があります。 – kritzikratzi
related:[なぜインターフェイスで静的メソッドを宣言できませんか?](http://stackoverflow.com/questions/21817/why-cant-i-declare-static-methods -in-an-interface) –
参照:[Javaインターフェイスの静的メソッドの回避策?](http://stackoverflow.com/questions/1724502/java-interface-static-method-workaround) –