获取真正的班级类型

时间:2018-05-18 19:25:28

标签: java class casting

如果我这样做:

String s = "hello";
Class<?> c = s.getClass();

然后c实际上是Class但是有一个String。 那么如何获得String类型?

因为如果我使用: c.getClass()我明显感到Class类型。

2 个答案:

答案 0 :(得分:4)

因此,Class<?> c将引用Type of Type String的对象。关于String类,Class<?> c基本上有一些metadata

    String s = "hello";
    Class<?> c =  s.getClass();
    String s1 = (String) c.newInstance();

编辑:

因此,Class对象上有几种方法可以检索有关Class的信息:

    Class#getName() //the name of the class or interface represented by this object with package name
    Class#getSimpleName() // returns only the name of the Class

例如:

String s = "hello";
Class<?> c =  s.getClass();
System.out.println("Name : "+c.getName());
System.out.println("Simple Name: "+c.getSimpleName());
System.out.println("Canonical Name: "+c.getCanonicalName());
System.out.println("Type Name : "+c.getTypeName());

您将获得输出:

Name : java.lang.String
Simple Name: String
Canonical Name: java.lang.String
Type Name : java.lang.String

注意:正如您可以看到不同方法获得的相同返回值(例如getCanonicalName,getCanonicalName等),总是知道差异可能不一样,请点击下面提供的链接。

从中可以看出,Class对象上有几种方法可以获得有关metadata information的{​​{1}}。请点击docs了解详情。

答案 1 :(得分:2)

首先:您可以从对象获取类实例,因为类的实例与类相关联(而getClass()类中存在Object方法)但它没有'因为类没有与特定实例相关联,所以以另一种方式工作。

第二:要获取类型,您不关心在Class声明的类型中是否指定了无界通配符,因为泛型会在运行时被删除。
重要的是String对象本身知道与Class对象关联的类(此处为Class)的信息。
例如,您可以编写一个或第二个:

Class<? extends String> c = s.getClass();
Class<?> c = s.getClass();

在任何情况下,您都可以在调用时检索String类型:

String typeName = c.getTypeName(); // --> java.lang.String
String name = c.getName(); // --> java.lang.String