[ API] java.lang.Class 1.0
static Class forName(String className)
返回描述類名為className的Class對象蚣抗。String getName()
返回類的全限定的類名(包含包名)匆瓜。String getSimpleName()
返回不含包名的類名String getCanonicalName()
返回全限定的類名
實例Test.java:
class Dog {
static {
System.out.println("我被加載了");
}
}
public class Test {
public static void main(String[] args) {
Class c = null;
try {
c = Class.forName("com.test.Dog");
System.out.println(c.getName());
System.out.println(c.getSimpleName());
System.out.println(c.getCanonicalName());
}catch (ClassNotFoundException e){
System.exit(1);
}
try{
Class.forName("com.test.Dog");
}catch (ClassNotFoundException e){
System.exit(1);
}
}
}
輸出:
我被加載了
com.test.Dog
Dog
com.test.Dog
forName()是取得Class對象的引用的一種方法。第二個try語句沒有輸出任何結(jié)果椅棺,說明痕寓,如果類Dog還沒有被加載就會加載它挣棕,如果加載了就不會再次加載厨疙。
[API] java.lang.Object 1.0
- Class getClass()
返回表示該對象的實際類型的Class引用
實例Test.java:
class Dog {
static {
System.out.println("我被加載了");
}
}
public class Test {
public static void main(String[] args) {
Dog dog= new Dog();
Class c1 = dog.getClass();
System.out.println(c1.getName());
System.out.println(c1.getSimpleName());
System.out.println(c1.getCanonicalName());
}
}
上述代碼表明墙牌,當我們知道了某個類型的具體對象后,那就可以通過調(diào)用getClass()方法來獲取Class引用了魄缚。它是屬于Object類的一部分宝与。
[ API] java.lang.Class 1.0
Class[] getInterfaces()
返回的是這個Class對象實現(xiàn)的接口的Class對象數(shù)組。boolean isInterface()
返回這個Class對象是否表示一個接口冶匹。返回的是基類习劫,而不是接口。Object newInstance()
返回這個類的新實例嚼隘。返回的是一個Object引用诽里,但是這個引用指向這個類的類型對象。使用newInstance()來創(chuàng)建的類飞蛹,必須帶有默認的構(gòu)造器谤狡。Class getSuperClass()
返回你可以用來進一步查詢的Class對象匿乃。
實例Test.java:
interface Run {
void run();
}
interface Jump {
void jump();
}
class Person {
private String name = "defaultName";
private int age = 0;
Person() {}
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
class Sportsman extends Person implements Run, Jump {
Sportsman(String name, int age) {
super(name, age);
}
public void run() {
}
public void jump() {
}
}
public class Test {
public static void main(String[] args) {
Sportsman sportsman = new Sportsman("noshower", 22);
Class c1 = sportsman.getClass();
Class c2 = null;
try {
c2 = Class.forName("com.test.Jump");
} catch (ClassNotFoundException e) {
System.exit(1);
}
System.out.println("c1 is interface? " + c1.isInterface());
System.out.println("c2 is interface? " + c2.isInterface());
Class[] cc = c1.getInterfaces();
for (Class face : cc) {
System.out.println("face name is " + face.getName());
}
Class parent = c1.getSuperclass();
System.out.println("parent is " + parent.getName());
Object obj = null;
try {
obj = parent.newInstance();
}catch (InstantiationException e){
System.exit(1);
}catch (IllegalAccessException e){
System.exit(1);
}
System.out.println(" name is "+((Person)obj).getName()+"age is "+((Person) obj).getAge());
}
}
輸出:
c1 is interface? false
c2 is interface? true
face name is com.test.Run
face name is com.test.Jump
parent is com.test.Person
name is defaultNameage is 0
類字面量語法
生成對Class對象的引用,即使用類字面常量豌汇。就像下面這樣:
FancyToy.class
類字面常量不僅可以應用于普通的類,也可以應用于接口泄隔、數(shù)組以及基本數(shù)據(jù)類型拒贱。另外基本數(shù)據(jù)類型的包裝器類,還有一個標準的字段TYPE佛嬉。TYPE字段是一個引用逻澳,指向?qū)幕緮?shù)據(jù)類型Class對象。如下所示:
..... 等介于.... | |
---|---|
boolean.class | Boolean.TYPE |
char.class | Character.TYPE |
byte.class | Byte.TYPE |
short.class | Short.TYPE |
int.class | Integer.TYPE |
long.class | Long.TYPE |
float.class | Float.TYPE |
double.class | Double.TYPE |
void.class | Void.TYPE |
注意:當使用".class"來創(chuàng)建對Class對象的引用時暖呕,不會自動地初始化該Class對象斜做。
初始化被延遲到了對靜態(tài)方法或非常數(shù)靜態(tài)域進行首次引用時才執(zhí)行。