Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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_Invoke_Instanceof_Instances - Fatal编程技术网

Java 调用带注释的方法而不为所有带注释的方法创建实例

Java 调用带注释的方法而不为所有带注释的方法创建实例,java,annotations,invoke,instanceof,instances,Java,Annotations,Invoke,Instanceof,Instances,我在一个类中有两个注释,比如@annotation_1和@annotation_2,这意味着我创建了两个实例---如果有任何错误,请更正此声明 现在,我找到了所有用@annotation_1或@annotation_2注释的方法,现在我需要测量每个注释方法所花费的时间 e、 g @annotation_1 Method1 { ... } @annotation_2 Method2 {

我在一个类中有两个注释,比如@annotation_1和@annotation_2,这意味着我创建了两个实例---如果有任何错误,请更正此声明

现在,我找到了所有用@annotation_1或@annotation_2注释的方法,现在我需要测量每个注释方法所花费的时间

e、 g

      @annotation_1
      Method1
      {
       ...
      }

      @annotation_2
      Method2
      {
       ...
      }

      @annotation_1
      Method3
      {
       ...
      }

      Method4
      {
       ...
      }

现在考虑我需要为NealTimeType()测量每个方法,仅用@ AnNOTIONTUR1注释。因此,我使用system.nanotime()来测量调用方法之前所用的时间

startTime = System.nanoTime();
然后,我使用

 Object obj = null;
 try {
                    startTime = System.nanoTime();
                    m.invoke(obj);
                }finally{
                    stopTime = System.nanoTime();
                    runTime = BigDecimal.valueOf(stopTime - startTime);
                } 
然后使用“m.invoke(obj)”调用,我需要这样做,因为我可能正在访问甚至用@annotation_1注释的非静态方法。i、 例如,我需要依次调用Method1,然后找到它的运行时,然后调用Method3,然后分别找到它们的运行时

<> p>但是您可以看到这个调用创建两个实例,即,对于@ ANNNOTIONEX1和@ ANNOTITIONS2,虽然我只考虑注释“1”注释的方法。 我如何摆脱这个调用。是否有替代方法来调用使用特定注释注释的方法

提前感谢……)

编辑:1

要检索这些方法,请执行以下操作:

for(Class<?> currentClass: args){
            List < Method > methods = Arrays.asList(currentClass.getDeclaredMethods());
            for (Method m: methods) {

                Annotation[] annotations = m.getDeclaredAnnotations();

                for (Annotation annotation: annotations) {

                    if ((annotation instanceof annotation_1)) {
                   ... //code to find time by invoking method as given above
                    } else if ((annotation instanceof annotation_2)) {
                       ...//code to find time by invoking method as given above
                    } else
                    {
                        System.err.println("No. definition for annotation :  @"+annotation);
                    }

                }
            }
        }
for(类currentClass:args){
Listmethods=Arrays.asList(currentClass.getDeclaredMethods());
用于(方法m:方法){
Annotation[]annotations=m.getDeclaredAnnotations();
用于(注释:注释){
if((注释_1的注释实例)){
…//通过调用上述方法查找时间的代码
}else if((注释_2的注释实例)){
…//通过调用上述方法查找时间的代码
}否则
{
System.err.println(“注释的编号定义:@”+注释);
}
}
}
}

Args在运行时获取所有类名。

您只需要具有这些方法的类的一个实例,然后您可以使用该对象调用任何这些方法。

发布用于检索这些方法的代码。@YazanJaber我编辑了这个问题。。。请看一看……如果您不希望创建目标类的多个实例,您可以缓存对象的一个实例,并将其用于以后的所有调用?实际上,问题是当我需要调用非静态方法时,我需要创建一个实例。。。。这将创建两个实例,即注释_1和注释_2。因此,当我使用m.invoke(obj)时,它会同时调用我不需要的两个实例,因为只需要创建注释的实例,而不需要同时创建这两个实例。我只需要调用该特定带注释方法的类的实例,而不是调用所有注释。@manoj,当您用不同的注释对一个方法进行注释时,您不会创建任何实例。当您使用new关键字或使用Class.newInstance()方法时,即创建实例时。创建一个实例时,不管注释了多少个方法,您只创建了一个实例。如果该类有两个注释,并且当我使用class.newInstance()方法时,它会创建两个注释的实例,对吗?如果是这种情况,那么调用(obj)并调用两个实例,对吗?我还需要使用Class.newInstance(),因为有些类是非静态的。。。。你能帮我一下吗?它创建了目标类的一个新实例,你可以使用该实例调用该类中的任何方法,不管它用什么注释。