首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以编程方式确定java实例的编译类型。

以编程方式确定java实例的编译类型。
EN

Stack Overflow用户
提问于 2014-04-07 17:04:00
回答 1查看 1.2K关注 0票数 2

假设我有一个扩展java.lang.Object的类,如下所示:

代码语言:javascript
复制
package pack;

public class Person {

}

以下三种情况:

代码语言:javascript
复制
Object one = new Object();
Object two = new Person();
Person three = new Person();

为了确定运行时类型的,我只需要对实例调用getClass()方法,如下所示:

代码语言:javascript
复制
System.out.println("One runtime-type : " + one.getClass());
System.out.println("Two runtime-type :  " + two.getClass());
System.out.println("Three runtime-type : " + three.getClass());

其中产出:

代码语言:javascript
复制
One runtime-type : class java.lang.Object
Two runtime-type :  class pack.Person
Three runtime-type : class pack.Person

现在,我的问题是如何以编程方式确定上述实例的static/compile-type

所谓静态/编译类型,我指的是“左边”类型。It 输出:

代码语言:javascript
复制
One compile-type : class java.lang.Object
Two compile-type :  class java.lang.Object
Three compile-type : class pack.Person
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-07 17:26:12

您没有指定何时要查找编译时类型。从示例输出中,我假设您希望在运行时打印出编译时类型。

这是不可能的(update:),除非您手动完成,并且事先知道要使用的所有类型。

如果您知道您将只使用对象类和Person类,则可以尝试下面的代码。您需要为每个使用的类定义一个方法,并且编译器足够聪明,可以使用最佳匹配方法。

代码语言:javascript
复制
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;
    }
}

这张打印出来:

代码语言:javascript
复制
One compile-type : class java.lang.Object
Two compile-type : class java.lang.Object
Three compile-type : class Program$Person

注意,如果要将该方法应用于接口,则此方法可能会中断,当编译器无法决定使用哪种方法时,可能会遇到这种情况。

原来的答案:

您基本上是在问源代码中变量的类型。在运行时,源代码中只剩下由Java编译器生成的字节码。此字节码不包含任何有关变量类型的信息。

以下是字节码在源代码中的样子:

代码语言:javascript
复制
  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没有任何内置操作符,您可以使用这些运算符在编译时捕获变量的类型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22918705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档