我猜你在想什么,有一个像
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 2012-04-11 21:34:43
相关:[为什么我不能在界面中声明静态方法?](http://stackoverflow.com/questions/21817/why-cant-i-declare-static-methods -in-an-interface) – 2012-04-11 21:34:55
另请参阅:[Java接口静态方法替代方法?](http://stackoverflow.com/questions/1724502/java-interface-static-method-workaround) – 2012-04-11 21:35:40