子类的JNI FindClass格式是什么?

20

什么是正确的FindClass标识符语法来加载子类?例如:

package a.b.c;

class Foo {
   class Bar {
     ...
   }
}

我可以使用(*env)->FindClass(env, "/a/b/c/Foo")获取Foo,但尝试通过(*env)->FindClass(env, "a/b/c/Foo/Bar")获取Bar会抛出一个ClassNotFoundException异常。是否有一种不同的语法来表示子类?

1个回答

53

没关系,javap工具在这里证明了它的帮助。正确的语法是:

a/b/c/Foo$Bar


1
这是一个通用原则。您应该始终使用javap,而不是试图自己弄清楚。 JNI方法和类型签名是另一个例子,javap知道正确的答案。 - user207421
除非在这种情况下,我试图在转换任意代码的同时执行它,因此启动javap并尝试匹配输出不会完全起作用。 - Ian Wetherbee
我不明白。你的问题比你问的还要多吗? - user207421
这个问题的关键是要找出这些标识符的通用语法,以便在遍历解析树时创建它们。对每个文件运行javap并尝试匹配签名最多会很麻烦,因此我正在寻找一个标识符的“公式”,不包括匿名类。它似乎是“pa.cka.ge.Outer$Middle$Inner”。 - Ian Wetherbee
2
还要注意,对于非静态嵌套类(内部类),构造函数需要一个额外的外部类参数,使得签名不是看起来那样。在这个例子中,它将是“(La/b/c/Foo;)V”。当然,javap 在调试时也很有帮助 :) - AndrewJC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接