long.Class和Long.TYPE之间的区别

时间:2014-01-30 18:04:49

标签: java junit autoboxing

他们都返回同样的东西,即长班。实际上我在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 });

最好使用哪种方法来记住自动装箱/拆箱开销。

**我在测试中传递原始长度,甚至测试的方法只需要原始长度。

4 个答案:

答案 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。

http://www.cis.upenn.edu/~bcpierce/courses/629/jdkdocs/guide/innerclasses/spec/innerclasses.doc9.html