假设我有一个扩展java.lang.Object的类,如下所示:
package pack;
public class Person {
}以下三种情况:
Object one = new Object();
Object two = new Person();
Person three = new Person();为了确定运行时类型的,我只需要对实例调用getClass()方法,如下所示:
System.out.println("One runtime-type : " + one.getClass());
System.out.println("Two runtime-type : " + two.getClass());
System.out.println("Three runtime-type : " + three.getClass());其中产出:
One runtime-type : class java.lang.Object
Two runtime-type : class pack.Person
Three runtime-type : class pack.Person现在,我的问题是如何以编程方式确定上述实例的static/compile-type?
所谓静态/编译类型,我指的是“左边”类型。It 将输出:
One compile-type : class java.lang.Object
Two compile-type : class java.lang.Object
Three compile-type : class pack.Person发布于 2014-04-07 17:26:12
您没有指定何时要查找编译时类型。从示例输出中,我假设您希望在运行时打印出编译时类型。
这是不可能的(update:),除非您手动完成,并且事先知道要使用的所有类型。
如果您知道您将只使用对象类和Person类,则可以尝试下面的代码。您需要为每个使用的类定义一个方法,并且编译器足够聪明,可以使用最佳匹配方法。
public class Program {
static class Person {
}
public static void main(String[] params) throws Exception {
Object one = new Object();
Object two = new Person();
Person three = new Person();
System.out.println("One compile-type : " + getStaticType(one));
System.out.println("Two compile-type : " + getStaticType(two));
System.out.println("Three compile-type : " + getStaticType(three));
}
public static Class getStaticType(Person p) {
return Person.class;
}
public static Class getStaticType(Object o) {
return Object.class;
}
}这张打印出来:
One compile-type : class java.lang.Object
Two compile-type : class java.lang.Object
Three compile-type : class Program$Person注意,如果要将该方法应用于接口,则此方法可能会中断,当编译器无法决定使用哪种方法时,可能会遇到这种情况。
原来的答案:
您基本上是在问源代码中变量的类型。在运行时,源代码中只剩下由Java编译器生成的字节码。此字节码不包含任何有关变量类型的信息。
以下是字节码在源代码中的样子:
public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: new #2 // class java/lang/Object
3: dup
4: invokespecial #1 // Method java/lang/Object."<init>":()V
7: astore_1
8: new #3 // class Program$Person
11: dup
12: invokespecial #4 // Method Program$Person."<init>":()V
15: astore_2
16: new #3 // class Program$Person
19: dup
20: invokespecial #4 // Method Program$Person."<init>":()V
23: astore_3
24: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;
27: new #6 // class java/lang/StringBuilder
30: dup
31: invokespecial #7 // Method java/lang/StringBuilder."<init>":()V
34: ldc #8 // String Two runtime-type :
36: invokevirtual #9 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
39: aload_2
40: invokevirtual #10 // Method java/lang/Object.getClass:()Ljava/lang/Class;
43: invokevirtual #11 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
46: invokevirtual #12 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
49: invokevirtual #13 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
52: return
}您可以看到,除了调用Person的构造函数之外,没有对Person类型的引用,因此丢失了例如变量three类型Person的信息。而且,Java没有任何内置操作符,您可以使用这些运算符在编译时捕获变量的类型。
https://stackoverflow.com/questions/22918705
复制相似问题