他们都返回同样的东西,即长班。实际上我在PrivilegedAccessor中使用它来传递如下
PrivilegedAccessor.invokeMethod(MyClass,
"MyMethod", new Object[] { arg1, arg2 },
new Class[] { long.class, Date.class });
或者我可以使用
PrivilegedAccessor.invokeMethod(MyClass,
"MyMethod", new Object[] { arg1, arg2 },
new Class[] { Long.TYPE, Date.class });
最好使用哪种方法来记住自动装箱/拆箱开销。
**我在测试中传递原始长度,甚至测试的方法只需要原始长度。
答案 0 :(得分:10)
它们都代表long
基元类型。它们完全相同,即使在编译的字节码中也是如此。示例程序:
public class Main
{
public static void main(String[] args) {
Class<Long> c = Long.TYPE;
Class<Long> c1 = long.class;
}
}
然后,使用javap -c Main
:
c:\dev\src\misc>javap -c Main
Compiled from "Main.java"
public class Main {
public Main();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":
()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/Long.TYPE:Ljava/lang/Class;
3: astore_1
4: getstatic #2 // Field java/lang/Long.TYPE:Ljava/lang/Class;
7: astore_2
8: return
}
答案 1 :(得分:2)
这些完全相同。
long.class == Long.TYPE; //always true
int.class == Integer.TYPE; //always true
float.class == Float.TYPE; // always true
“TYPE”常量始终具有基本类的值。我通常只使用TYPE的东西,当我不用Java编程时,“int.class”语法不可用。
关于反射和拳击事物:
对于反射调用,原始值始终装箱,因为对象数组不能包含原始值。所以你传递的内容并不重要。
这两个操作也可以返回不同的方法:
Method fooInt = class.getMethod("foo", String.class, int.class);
Method fooInteger = class.getMethod("foo", String.class, Integer.class);
fooInt.equals(fooInteger); // false
答案 2 :(得分:0)
执行此类操作的最常见方法是通过Long.class
。您很少会在生产代码中看到long.class
。
内存占用空间是NEGLIGIBLE。您可以使用这两种方法运行基准测试,将它们称为1kkk次,并且您不会发现太大的差异。
答案 3 :(得分:-2)
long
是一种原始类型,不是Java类。但Long
是一种类型(扩展Object
),因此是一个Java类。你可以使用任何一种,因为Java有一个Boxing和UnBoxing功能,可以自动将一个转换为另一个。
但要注意,原始类型往往会消耗更少的内存,但Class类型中有非常有用的方法。你决定什么对你更好。
编辑:
不确定为何投票。
如下文所述:
“基本类型或void的类文字等同于对预安装的基元类型描述符的静态变量引用”
所以long.class
不是Java类。
Long.TYPE在JVM源代码中分配如下:
public static final Class<Long> TYPE = (Class<Long>) Class.getPrimitiveClass("long");
,使用的方法如下:
static native Class getPrimitiveClass(String name);
所以long.class
是一个指向原始变量的指针,该变量不是java类。
long.class == Long.class
评估为FALSE。