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(),不过我可能会在有时间的时候尝试一下。谢谢你的帮助。