我正在Java ME环境中编写代码,因此速度绝对是一个重要因素。我已经阅读了几个地方,任何类型的反射(即使是在Java ME上允许的非常有限的数量)也可能是一个非常大的瓶颈。
所以,我的问题是:String.class.getName()
做得慢吗?那么myCustomObject.getClass().getName()
呢?简单地用字符串常量替换那些,比如“java.lang.String”和“com.company.MyObject”?
如果您想知道,我需要所有原语的类名(以及非原语),因为Java ME不提供默认的序列化实现,因此我必须实现自己的。我需要一个通用的序列化解决方案,它既适用于网络通信,也适用于本地存储(RMS,还有JSR-75)
修改
我正在使用Java 1.3 CLDC。
答案 0 :(得分:5)
String.class.getName()
不会很慢,因为它的值将在执行之前加载。编译器将在执行行之前将其值放入。
myCustomObject.getClass().getName()
将更慢然后是之前,因为它将在执行时被检索
答案 1 :(得分:1)
反思不是不自然慢;它和你期望的一样慢,但不会慢。首先,通过反射调用方法需要从反射API中显而易见的所有对象创建和方法调用,其次,如果您通过反射调用方法,Hotspot将无法通过调用进行优化。
调用getClass().getName()
并不比你预期的要慢:一些虚方法调用的成本加上成员变量提取。 .class
版本基本相同,加上或减去变量提取。
答案 2 :(得分:0)
我不能代表Java ME,但我对通过在资源受限系统上使用反射而产生的开销并不感到惊讶。我不认为它是无法忍受的缓慢,但肯定会看到将名称硬编码为变量的改进。
既然你提到你在看序列化,我建议你看看它在Kryo项目中是如何完成的。你可能会发现他们的一些方法很有用,你甚至可以在Java ME中使用它。 (不幸的是,我没有ME经验)