如果我这样做:
String s = "hello";
Class<?> c = s.getClass();
然后c
实际上是Class
但是有一个String
。
那么如何获得String
类型?
因为如果我使用:
c.getClass()
我明显感到Class
类型。
答案 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