2016-08-12 197 views
1

我已经使用了protobuf了很多。但是今天,当我试图对生成的protobuf类使用反射时,我得到了一个没有发现的类异常。 (我知道这不是一个正常的protobuf用例)。这个类被其他方法用在同一个文件中,并且它被编译并运行时没有问题。对生成的Protobuf的Java反射,但没有找到类

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

一切都很完美。

问题的可能性。

您的类路径已损坏(这是Java世界中非常常见的问题)。

如果您知道类或包含该类的jar的路径,请在运行时将其添加到类路径中。您可以使用类路径这里提到:

在Windows

java -classpath .;yourjar.jar YourMainClass 
on UNIX/Linux 

java -classpath .:yourjar.jar YourMainClass 

你的情况回答是

所有产生的protobuf类是静态内部类。为了使它工作,我必须使用'$'而不是''。表示完全限定类名的最后一部分:Class.forName(“com.foo.protobuf.Foo $ Bar”)。

+0

该类在那里并被同一文件中的其他方法使用,并且没有运行时错误。这只是不能被Class.forName找到。我认为这与班级装载机有关。 –

+0

在我的系统中工作完美 –

+0

再一次检查你发送的函数classpath是否完全合格? –

3

刚刚发现它与protobuf没有任何关系。这是关于如何引用一个内部类。

所有生成的protobuf类都是静态内部类。为了使它工作,我必须使用'$'而不是''。表示完全限定类名的最后一部分:Class.forName(“com.foo.protobuf.Foo $ Bar”)。

对不起回答我自己的问题。希望它能帮助处于相同情况的人。