2017-01-23 25 views
0

我在Android中使用JavaAssist爲某個目的製作動態類。當試圖獲得java.lang.String時,ClassPool get()方法拋出NotFoundExceptionJavaAssist ClassPool類'get方法拋出java.lang.String的NotFoundException

它在JUnit測試中工作正常。但是如果我在設備中運行相同的程序,它會拋出異常。

這是我正在嘗試的代碼片段。

ClassPool classPool = ClassPool.getDefault(); 
CtClass ctClass=classPool.get("java.lang.String"); 

第二行引發異常。

請幫忙。

+0

你的ClassPool.java中的get(String str)方法返回什麼?它是如何實現的?您可以編輯您的原始代碼並添加它的代碼...不應該像下面這樣創建類「ClassPool」的對象'classPool':'ClassPool classPool = new ClassPool();'您的構造函數你的ClassPool.java類看起來像? –

+0

get方法返回CtClass的實例。如果沒有找到它會拋出NotFoundException。 ClassPool是javassist中的預定義類,因此我無法修改代碼。 ClassPool.getDefault()返回ClassPool類的單例實例。 – user7409419

回答

0

嘗試此代碼:

ClassPool classPool = new ClassPool(); 
classPool.getDefault(); 
+0

不工作。它可能是JVM vs DVM的問題。因爲我的JUnit測試用例成功運行並且在設備上沒有。 – user7409419

0

Android是使用其中的Java字節代碼被改造成在Dalvik類格式不同的類文件表示。這種格式不能由任何Java字節碼操作工具處理,這就是爲什麼Javassist不起作用。

在內部,Javassist調用classLoader.getResourceAsStream("java/lang/String.class"),由於類文件在運行時不存在,所以在Dalvik VM上返回null

+0

我明白了。有一些解決辦法嗎? – user7409419

+0

您不能在Android上使用Javassist。如果你想創建運行時子類,你可以看看Byte Buddy,但是在運行時沒有辦法操作類; Android甚至不提供檢測API。 –

0

嘗試使用「Ljava.lang.String」或「Ljava.lang.String;」更改字符串「java.lang.String」它應該工作。

由於您正在加載嵌入到Java中的類,因此您的計算機不能識別字符串的標準名稱,但需要由JVM內部使用的名稱來標識此特定對象。

爲了更多地瞭解這個「L」問題,我建議你閱讀JVM specs特別注重chapter 4.3,也是很容易理解和更短的只是閱讀本question談到有關數組,但也包括這個符號。

相關問題