2016-08-12 44 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」)。

對不起回答我自己的問題。希望它能幫助處於相同情況的人。