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

验证静态外部类的私有静态嵌套类的非静态方法的调用

范浩宕
2023-03-14

如何验证是否调用了私有嵌套类的非静态方法?这就是我目前的情况:

new Verifications() {
    {
        Deencapsulation.invoke(MyClass.class.getDeclaredClasses()[0], "run" );
        times = 4;
    }
};

我明白了:

java.lang.IllegalArgumentException: Attempted to invoke non-static method without an instance to invoke it on...


更新1:

@丹尼斯,我试过以下方法,不过我得到了一个NPE。我想根据JVM中已经存在的单例验证run方法的运行,而不是创建它的新实例(正如我在下面的代码中所做的那样),以便调用方法m。我尝试调用m.invoke(null),但没有成功。有没有一种方法可以使用外部类的运行实例上的反射来验证jmockit中对私有嵌套类中非静态方法的调用(通过调用)?

    new Verifications() {
        Class c = MyClass.class.getDeclaredClasses()[0];
        Method m = c.getDeclaredMethod("run");
        //Method m = MyClass.class.getDeclaredClasses()[0].getDeclaredMethod("run", Integer.class, CallableClient.class);

        //Deencapsulation.invoke(MyClass.class.getDeclaredClasses()[0], "run" );
        Class[] a = new Class[] { Integer.class, CallableClient.class};
        Object cc = Deencapsulation.newInstance(c, a);
        //Object cc = Deencapsulation.newInstance(c, withInstanceOf(Integer.class), withInstanceOf(CallableClient.class));
        {
            try {
                System.out.println(MyClass.class.getDeclaredClasses()[0].getName());
                m.invoke(cc);
                times = 3;

更新2:

尝试获取如下方法失败后:final Field runnable=MyClass。班getDeclaredField(“nestedClassInstance”);可运行。setAccessible(真) getDeclaredMethods()以及getMethods(),我认为这种方法有太多错误,无法继续使用。我在测试中改变了测试内容。尽管我引入了一个内部嵌套类的实例,但我假设我看不到run方法的原因可能与以下一个或全部有关:其包含类的嵌套性质、构造函数、,java的行为/决定是在确保成功构建实例之前不显示实例方法。好奇地想知道为什么我肯定不能。

共有1个答案

范承望
2023-03-14

既然你说你想知道你是否试图在运行时调用一个非静态方法,那么这一点反射应该会有所帮助。

假设m是与您的方法相对应的方法实例,然后使用修饰符。isStatic(m.getModifiers())将在且仅当该方法是静态的时返回true,因此您可以在实际调用invoke之前执行此检查。如果您还没有方法对象,那么类似getMethod将对您有用。

有关方法修改器的文档。

编辑:所有这些都有助于在通过invoke调用方法之前检查该方法是否是静态的。如果您想使用类似jmockit的东西来发现这样的方法已经被调用,那么我个人想知道这将如何帮助您正在获得的IllegalArgumentExctive,特别是如果它被Invoke抛出,因为您正在尝试执行异常消息中所说的不允许的操作。即使您可以模拟它,这也可能涵盖了一个更深层次的问题。

 类似资料:
  • 我想知道是否有一种方法来验证和调用一个模拟,该模拟是为一个私有静态方法创建的,该私有静态方法是从一个被测试的公共静态方法调用的。 下面是我正在测试的公共静态方法 我已经使用powermokito对私有静态方法进行了如下嘲弄:

  • 我有一个类,其中有一些静态方法和一些非静态方法,所以当我试图从静态方法访问非静态方法时,我会遇到一个著名的错误。每当我搜索这个论坛,我得到的解决方案,当有两个类,从一个你试图达到另一个。我的问题是,如果它们在同一个类中,如何从静态方法调用非静态方法? 我试着用 但是我的方法包含发送Intent和finish(),所以如果我创建的对象不是finish,就不起作用。

  • 我在看一个项目,我发现了一些很奇怪的东西。 现在,我认为唯一的两个优点是,在非静态容器中封装时,命名更加清晰,并且可以传递的参数更少。 但我想知道这是不是一个好主意,通过设计来包装静态类与非静态?如果有的话,还有哪些其他原因?因为我认为创建一个静态并对其进行调用是可以的。但是这个项目特意将所有静态类打包;我也不知道为什么。

  • 我最近对 PHP 5.4 进行了更新,但收到有关静态和非静态代码的错误。 这是错误: 这是第371行: 我希望有人能帮忙。

  • 我有以下java代码: 我的问题如下:我收到一个文本和一种语言,我必须检查该文本是否仅使用该语言的有效字母字符书写。我的代码如下: 这很好,也很有效,但随着我在应用程序中添加语言,我将不得不在交换机中添加越来越多的案例。 我想知道在中是否有一种方法可以动态命名一个静态嵌套类,比如: 所以我上面的代码可能是这样的: 谢谢,如果这是超级简单的事情,我很抱歉。 我是一名开发人员,正在学习。

  • 问题内容: 尝试在静态类中调用非静态方法时遇到错误。 无法从类型播放中静态引用非静态方法methodName() 我不能使该方法静态,因为这也给我一个错误。 此静态方法无法从xInterface隐藏实例方法 有什么办法可以在另一个静态方法中轮回调用非静态方法?(这两种方法位于单独的包和单独的类中)。 问题答案: 从静态方法中调用非静态方法的唯一方法是使类的实例包含非静态方法。根据定义,非静态方法是