当前位置: 首页 > 知识库问答 >
问题:

找到和运行私有注释方法的最简单方法是什么?

彭阳荣
2023-03-14
import org.apache.commons.lang3.reflect.MethodUtils;

import javax.annotation.PostConstruct;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * Created by dims on 13.10.2016.
 */
public class CallPrivateMethodTest {

   @Retention(RUNTIME)
   @Target(METHOD)
   public @interface MyAnnotation {
   }

   public static class MyClass {

      @MyAnnotation
      private void myMethod() {
         System.out.println("myMethod() ran");
      }
   }

   public static void main(String[] args) {

      MyClass myObject = new MyClass();

      List<Method> methods = MethodUtils.getMethodsListWithAnnotation(myObject.getClass(), MyAnnotation.class);


      for(int i=0; i<methods.size(); ++i) {
         try {
            methods.get(i).invoke(myObject);
         } catch (IllegalAccessException e) {
            e.printStackTrace();
         } catch (InvocationTargetException e) {
            e.printStackTrace();
         }
      }
   }
}

共有1个答案

江丰羽
2023-03-14

必须对方法调用setAccessible(true)

请参见AccessibleObject的Javadoc,它是方法的超类型。

在您的示例中:

methods.get(i).setAccessible(true);
methods.get(i).invoke(myObject);
MyClass myObject = new MyClass ();

Method[] allMethods = myObject.getClass ().getDeclaredMethods ();
List<Method> annotatedMethods = Arrays.stream (allMethods)
                                      .filter (m -> m.getAnnotation (MyAnnotation.class) != null)
                                      .collect (Collectors.toList ());

for (Method method: annotatedMethods) {
  try {
    method.setAccessible (true);
    method.invoke (myObject);
  } catch (IllegalAccessException e) {
    e.printStackTrace ();
  } catch (InvocationTargetException e) {
    e.printStackTrace ();
  }
}
 类似资料:
  • 问题内容: 我们的Docker映像会发送封闭源代码,我们需要使用自己的私有Docker注册表将它们存储在安全的地方。我们搜索 具有简单身份验证层的部署私有docker注册中心的最简单方法 。 我发现 : 这种手动方式http://www.activestate.com/blog/2014/01/deploying-your-own-private-docker-registry 和基于stackb

  • 问题内容: 我在生产中有20GB +的rdb转储。我怀疑有一组特定的按键使它blo肿。我希望有一种方法可以始终从静态转储分析中发现前100个最大对象,或者将其询问给服务器本身,而服务器本身有7M个对象。 像rdbtools这样的转储分析工具在这个(我认为)非常常见的用例中无济于事! 我当时想编写一个脚本,并使用“ redis-cli调试对象”对整个键集进行迭代,但是我感觉必须缺少某些工具。 问题答

  • 最好的方法是什么?JCUDA是一个完美的映射到C CUDA还是完全不同?或者从Java调用C代码并共享结果是否有意义(链接列表是否可以访问)?

  • 本文向大家介绍PowerShell单行注释、多行注释、块注释的方法,包括了PowerShell单行注释、多行注释、块注释的方法的使用技巧和注意事项,需要的朋友参考一下 PowerShell的注释符分为行注释符和块注释符。行注释符使用井号(#)引起一行;块注释符使用“<#”和 “#>”来引起一段注释。 行注释符 举例如下: 块注释符、多行注释 举例如下: 这是小编每次写脚本之前,都会定义的一段关于脚

  • 我正在与一些开发人员合作,我们希望在处理项目代码的早期迭代时分享一些jar。我们只想弹出一个快速的私有maven存储库服务器来使用一小段时间。在Ruby中,它就像打字一样简单: 显然,没有? 即使是对github的一个简单maven依赖也可以在短时间内实现。显然,也没有主流可靠的maven插件? 我找到的最简单的答案就在这里:在github上托管一个Maven知识库。 当然,上面StackOver

  • 问题内容: 反转此ArrayList的最简单方法是什么? 问题答案: 示例(参考):