Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
限制具有特定注释的方法调用java方法_Java_Annotations_Testng - Fatal编程技术网

限制具有特定注释的方法调用java方法

限制具有特定注释的方法调用java方法,java,annotations,testng,Java,Annotations,Testng,我正在为一些sftp验证编写测试,并运行一个嵌入式sftp服务器 所以我有一门课,比如: public class SftpServer { //method to initialize server public void init(){}; //method to stop server public void stop(){}; } 现在,由于我的测试在多线程环境中运行,我希望服务器只启动或停止一次,因此我使用TestNG作为单元测试框架 因此

我正在为一些sftp验证编写测试,并运行一个嵌入式sftp服务器

所以我有一门课,比如:

public class SftpServer {

    //method to initialize server
    public void init(){};

    //method to stop server
    public void stop(){};

   }
现在,由于我的测试在多线程环境中运行,我希望服务器只启动或停止一次,因此我使用
TestNG
作为单元测试框架


因此,我希望
init
stop
方法只能通过
annotated
方法调用
@BeforeSuite
@AfterSuite
注释,我知道java文档可能是一种建议这样做的方法,但我希望强制执行它,在java中是否有可能以某种方式施加此限制?

这可能不是做您想做的事情的最佳选择,但无论如何您都可以实现:

public void test() {
    StackTraceElement element = getElement();
    try {
        Method m = Class.forName(element.getClassName()).getDeclaredMethod(element.getMethodName());
        Annotation[] annotations = m.getAnnotations();
        // do your thing
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

}

private static StackTraceElement getElement() {
    StackTraceElement[] elements = Thread.currentThread().getStackTrace();
    for (int i = 1; i < elements.length; i++) {
        StackTraceElement stackTraceElement = elements[i];
        if (!stackTraceElement.getClassName().equals(Bar.class.getName())
                && !stackTraceElement.getMethodName().equals("getElement()")
                && stackTraceElement.getClassName().indexOf("java.lang.Thread") != 0) {
            return stackTraceElement;
        }
    }
    return null;
}
公共无效测试(){
StackTraceeElement元素=getElement();
试一试{
方法m=Class.forName(element.getClassName()).getDeclaredMethod(element.getMethodName());
Annotation[]annotations=m.getAnnotations();
//做你的事
}捕获(无此方法例外){
e、 printStackTrace();
}catch(classnotfounde异常){
e、 printStackTrace();
}
}
私有静态stackTraceeElement getElement(){
StackTraceElement[]元素=Thread.currentThread().getStackTrace();
for(int i=1;i
有了调用者方法的注释列表,只需查找您想要的注释列表并执行您必须执行的操作


认为调用方方法来自另一个类,所以将其调整到您的需要。

< P>有两种通用方法来执行。 一个是用于执行运行时检查的
init
stop
方法。调用时,它们将检查堆栈,确定调用方,反射地确定调用方上的注释,如果调用方未使用
@BeforeSuite
@AfterSuite
注释,则抛出异常。这并不能阻止您编写不正确的调用,如果您编写了不正确的调用,它只会使测试套件崩溃


另一种方法是静态检查。编译调用
init
stop
的方法时,如果该方法未使用
@BeforeSuite
@AfterSuite
注释,编译器将发出错误。这会在编译时提前通知您错误,从而防止您运行错误代码。要实现这一点,您可以使用工具(如)或插件(如)编写注释处理器。

No,注释只包含编译器的元信息,无法限制对方法的访问。如果不是正确的注释,则查找调用方法的注释类名并引发异常如何?找到调用方法并使用反射解析其注释:)我不知道是否有方法获取调用方法的注释类名没有标准的方法,所以它会涉及大量的黑客代码,但没有什么好处。