我经常使用protobuf。但是今天,当我尝试在生成的protobuf类上使用反射时,我得到了一个未找到类的异常。 (我知道这不是一个普通的protobuf用例)。该类通过其他方法在同一个文件中使用,并且编译并运行没有问题。
import com.foo.protobuf.Foo.Bar;
...
void method1() {
Bar.Builder bld = Bar.newBuilder();
...
}
void method2(String clsName) {
// clsName = "com.foo.protobuf.Foo.Bar"
Class clsBar = Class.forName(clsName); // CNF Exception here
}
我的代码出了什么问题? 感谢您的任何意见。
答案 0 :(得分:3)
刚刚发现它与protobuf无关。它是关于如何引用内部阶级的。
所有生成的protobuf类都是静态内部类。为了使其有效,我必须使用' $'而不是'而不是'表示完全限定类名的最后一部分:Class.forName(" com.foo.protobuf.Foo $ Bar")。
很抱歉回答我自己的问题。希望它可以帮助处于相同情况的人。
答案 1 :(得分:0)
一切都很完美。
问题的可能性。
您的类路径已损坏(这是Java世界中一个非常常见的问题)。
如果你知道类的路径或包含类的jar,那么在运行它时将它添加到类路径中。您可以使用此处提到的类路径:
Windows上的
java -classpath .;yourjar.jar YourMainClass
on UNIX/Linux
java -classpath .:yourjar.jar YourMainClass
在您的情况下答案是
所有生成的protobuf类都是静态内部类。为了使它工作,我必须使用'$'而不是'。'表示完全限定类名的最后一部分:Class.forName(“com.foo.protobuf.Foo $ Bar”)。