2017-01-23 175 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谈到有关数组,但也包括这个符号。

相关问题