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

Java 验证静态外部类的私有静态嵌套类的非静态方法的调用,java,jmockit,Java,Jmockit,如何验证是否调用了私有嵌套类的非静态方法? 这就是我到目前为止所做的: new Verifications() { { Deencapsulation.invoke(MyClass.class.getDeclaredClasses()[0], "run" ); times = 4; } }; 我明白了: java.lang.IllegalArgumentException: Attempted to invoke non-static metho

如何验证是否调用了私有嵌套类的非静态方法? 这就是我到目前为止所做的:

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.class.getDeclaredField(“nestedClassInstance”);runnable.setAccessible(true)
然后使用
getDeclaredMethods()
以及
getMethods()
,我认为这种方法有太多错误,无法继续。我已经改变了我测试的内容。尽管我引入了一个内部嵌套类的实例,但我假设我看不到
run
方法的原因可能与以下一个或全部有关:其包含类的嵌套性质、构造函数、,java的行为/决定是在能够确保成功构建实例之前不显示实例方法。我很想知道为什么我不能肯定地说。

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

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

文件打开,和



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

您是否正在寻找在运行时找到答案的方法?通过思考是可以做到的。是的,我是。这种方法是什么样子的?这需要一个外部类的实例,但我正在避免它,除了创建它之外,可能别无选择:。没有公共构造函数,也没有任何公共方法可以获取外部类的/a实例。我将尝试以下操作:
fieldinstance=MyClass.class.getDeclaredField(“\u instance”);setAccessible(true)
然后
m.invoke(instance)
我不知道如何获取对私有静态嵌套类的引用,因为没有它的实例…正确。所以,我创建了嵌套类的一个实例,我在外部类的一个方法中创建了这个实例。在我的测试中,我现在得到的嵌套实例如下:
final Field runnable=MyClass.class.getDeclaredField(“nestedClassInstance”);runnable.setAccessible(true)
我无法从
runnable
获取方法,尽管我不知道为什么。我使用
getDeclaredMethods()
以及
getMethods()
打印了所有的方法。那么,
getDeclaredMethods()
getMethods()
是否没有得到您想要的方法呢?(我假设您也尝试了
getMethod()
)我没有尝试getMethod(),不过我可能会在有时间的时候尝试一下。谢谢你的帮助。