Java Object.class.getName()速度慢吗?

Java Object.class.getName()速度慢吗?,java,serialization,reflection,java-me,cldc,Java,Serialization,Reflection,Java Me,Cldc,我在JavaME环境中编写代码,因此速度绝对是一个重要因素。我读过好几篇文章,认为任何类型的反射(即使是javame上允许的非常有限的数量)都可能是一个非常大的瓶颈 所以,我的问题是:String.class.getName()做得慢吗?那么myCustomObject.getClass().getName()呢?简单地用字符串常量(如“java.lang.string”和“com.company.MyObject”)替换这些常量是否更好 如果您想知道,我需要所有原语(以及非原语)的类名,因为J

我在JavaME环境中编写代码,因此速度绝对是一个重要因素。我读过好几篇文章,认为任何类型的反射(即使是javame上允许的非常有限的数量)都可能是一个非常大的瓶颈

所以,我的问题是:
String.class.getName()
做得慢吗?那么
myCustomObject.getClass().getName()
呢?简单地用字符串常量(如“java.lang.string”和“com.company.MyObject”)替换这些常量是否更好

如果您想知道,我需要所有原语(以及非原语)的类名,因为JavaME不提供默认的序列化实现,因此我必须实现自己的序列化实现。我需要一个通用的序列化解决方案,它既可以用于网络通信,也可以用于本地存储(RMS,但也可以用于JSR-75)

编辑

我使用的是Java1.3CLDC。

反射的速度并非异常缓慢;它和你想象的一样慢,但不慢。首先,通过反射调用方法需要所有对象创建和方法调用,这在反射API中是显而易见的;其次,如果通过反射调用方法,Hotspot将无法通过调用进行优化


调用
getClass().getName()
也不会比您预期的慢:两个虚拟方法调用的成本加上一个成员变量fetch。
.class
版本本质上是相同的,加上或减去一个变量fetch。

我不能代表JavaME说话,但我对在资源受限的系统上使用反射的开销并不感到惊讶。我不认为它的速度太慢,但您肯定会看到将名称硬编码到变量中的改进

既然您提到您正在研究序列化,我建议您研究一下它在项目中是如何完成的。您可能会发现他们的一些方法很有用,见鬼,您甚至可以在JavaMe中使用它。(不幸的是,我对自己没有经验)

String.class.getName()
不会慢,因为它的值将在执行之前加载。也就是说,编译器将把它的值放在行执行之前。
myCustomObject.getClass().getName()
会比上一个稍微慢一点,因为它将在执行时被检索

您是否尝试过对其进行基准测试?如果您知道对象的类,那么询问它是没有意义的。String.class.getName()可以替换为“java.lang.String”。如果你不知道一个物体的类型,你怎么能不问就知道呢?先写。量。如果且仅当您有问题时,确定问题的来源,并在需要时进行优化。我想对其进行基准测试,但我的项目目前处于一种混乱状态,我需要数小时(可能数天)才能将此代码恢复到编译并再次运行的状态。现在我将使用常量(谢谢大家),但稍后我会回来介绍基准测试信息?远程通信或到rms/文件的持久性或其他东西?“我在Java ME环境中编写代码,因此速度绝对是一个重要因素。”——在这种优化级别上可能是错误的。评测/基准测试结果是速度非常重要的唯一原因。在JME模拟器上进行验证后,执行String.class.getName()的时间是可以忽略的