这一章节我们接着上一章节,继续讲述Class对象的使用与注意点。
1.使用例子
package com.ray.ch11;
public class Test {
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String[] args) {
try {
Class<Swimmer> swimmerClass = (Class<Swimmer>) Class
.forName("com.ray.ch11.Swimmer");
Swimmer swimmer = (Swimmer) swimmerClass.newInstance();
// 调用对象的方法
swimmer.say();
swimmer.swim();
// 得到类的名称
System.out.println(swimmer.getClass().getSimpleName());
// 打印接口
for (Class item : swimmer.getClass().getInterfaces()) {
System.out.println(item.getName());
}
// 得到父类的路径
System.out.println(swimmer.getClass().getSuperclass());
// new 父类
Person person = (Person) swimmer.getClass().getSuperclass()
.newInstance();
// 调用父类的方法
person.say();
} catch (ClassNotFoundException e) {
System.out.println("class not found");
} catch (InstantiationException e) {
System.out.println("instantiation");
} catch (IllegalAccessException e) {
System.out.println("illegal access");
}
}
}
interface canSwim {
void swim();
}
class Person {
public void say() {
System.out.println("i am a person");
}
}
class Swimmer extends Person implements canSwim {
public Swimmer() {
}
public Swimmer(int age) {
}
@Override
public void say() {
System.out.println("i am a swimmer");
}
@Override
public void swim() {
System.out.println("i can swim");
}
}
输出:
i am a swimmer
i can swim
Swimmer
com.ray.ch11.canSwim
class com.ray.ch11.Person
i am a person
上面的例子已经展示了大部分Class对象需要用到的东西。但是根据经验来说,一般在平常编程里面是不采取上面的方式,因为维护起来非常麻烦,如果Swimmer名字一改,整个类都不能够正常运行了。
2.注意点
(1)当需要创建Class.forName所对应的类对象的时候必须保证类里面有空的构造器,不然抛异常,因为newInstance不接受参数。
正确的代码:
package com.ray.ch11;
public class Test {
public static void main(String[] args) {
try {
Class<Swimmer> swimmerClass = (Class<Swimmer>) Class
.forName("com.ray.ch11.Swimmer");
swimmerClass.newInstance();
} catch (ClassNotFoundException e) {
System.out.println("class not found");
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
class Swimmer {
public Swimmer() {
}
public Swimmer(int age) {
}
}
错误的代码:
package com.ray.ch11;
public class Test {
public static void main(String[] args) {
try {
Class<Swimmer> swimmerClass = (Class<Swimmer>) Class
.forName("com.ray.ch11.Swimmer");
swimmerClass.newInstance();
} catch (ClassNotFoundException e) {
System.out.println("class not found");
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
class Swimmer {
public Swimmer(int age) {
}
}
错误代码会抛异常,输出:
java.lang.InstantiationException: com.ray.ch11.Swimmer
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
at com.ray.ch11.Test.main(Test.java:8)
总结:这一章节介绍了Class对象的使用与注意点,下一章节开始将介绍Class对象的其他方面。
这一章节就到这里,谢谢。
-----------------------------------