什么是Class对象?
首先Class对象是用来创建类的所有的“常规”对象,Java使用Class对象来执行RTTI。
每个类都有一个Class对象,该对象由JVM创建和加载。当程序创建第一个(注意是第一个哟)对类的静态成员的引用时,就会加载这个类。这一点说明了构造器也是类的静态方法,即使在构造器之前并没有使用static关键字。
类的加载过程
类加载器首先会检查这个类的Class对象是否已经加载,如果尚未加载,默认的类加载器就会根据类名查找.class文件。一旦这个类的Class对象被加载仅内存,就会被用来创建这个类的所有对象。
package thinking.java.chapter13;
class Candy{
static {
System.out.println("load candy");
}
}
class Gum{
static {
System.out.println("load gum");
}
}
class Cookie{
static {
System.out.println("load cookie");
}
}
public class SweetShop {
public static void main(String[] args) {
System.out.println("inside main");
new Candy();
System.out.println("after creating candy");
try {
Class.forName("Gum");
} catch (ClassNotFoundException e) {
System.out.println("couldn't find gum");
}
System.out.println("after Class.forName(\"Gum\")");
new Cookie();
System.out.println("after creating cookie");
}
}
由上面的例子可以得到:Class对象仅在需要的时候才被加载,static初始化在类加载时就进行了。
其中forName()是取得Class对象的引用的一种方法,返回的是一个Class对象的引用。如果在Class.forName()中找不到你要加载的类,那么就会抛出ClassNotFoundException
无论何时如果你想在运行时使用类型信息,就必须首先获得对恰当的Class对象的引用,如使用Class.forName().
练习1
package thinking.java.chapter13;
interface HasBatteries{}
interface WaterProof{}
interface Shoot{}
class Toy{
// 注释掉默认构造器后无法实例化该类
// 因为使用newInstance()来创建的类,必须带有默认的构造器
// Toy(){}
Toy(int i){}
}
class FancyToy extends Toy
implements HasBatteries,WaterProof,Shoot{
FancyToy(){
super(1);
}
}
public class ToyTest {
static void printInfo(Class cc) {
System.out.println("Class name:"+cc.getName()+
" is interface?["+cc.isInterface()+"]");
System.out.println("Smple name: "+cc.getSimpleName());
System.out.println("canonical name: "+cc.getCanonicalName());
}
public static void main(String[] args) {
Class x = null;
try {
x = Class.forName("thinking.java.chapter13.FancyToy");
} catch (ClassNotFoundException e) {
System.out.println("can't find fancytoy");
System.exit(1);
}
printInfo(x);
for(Class face:x.getInterfaces())
printInfo(face);
Class up = x.getSuperclass();
Object obj = null;
try {
obj = up.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
printInfo(obj.getClass());
}
}
练习2
package thinking.java.chapter13;
interface HasBatteries{}
interface WaterProof{}
interface Shoot{}
interface Files{}
class Toy{
// 注释掉默认构造器后无法实例化该类
// 因为使用newInstance()来创建的类,必须带有默认的构造器
Toy(){}
Toy(int i){}
}
class FancyToy extends Toy
implements HasBatteries,WaterProof,Shoot,Files{
FancyToy(){
super(1);
}
}
public class ToyTest {
static void printInfo(Class cc) {
System.out.println("Class name:"+cc.getName()+
" is interface?["+cc.isInterface()+"]");
System.out.println("Smple name: "+cc.getSimpleName());
System.out.println("canonical name: "+cc.getCanonicalName());
}
public static void main(String[] args) {
Class x = null;
try {
x = Class.forName("thinking.java.chapter13.FancyToy");
} catch (ClassNotFoundException e) {
System.out.println("can't find fancytoy");
System.exit(1);
}
printInfo(x);
for(Class face:x.getInterfaces())
printInfo(face);
Class up = x.getSuperclass();
Object obj = null;
try {
obj = up.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
printInfo(obj.getClass());
}
}
练习3:
package thinking.java.chapter13;
import java.util.Arrays;
import java.util.List;
abstract class Shape{
void draw() {
System.out.println(this+".draw()");
}
abstract public String toString();
}
class Circle extends Shape{
@Override
public String toString() {
// TODO Auto-generated method stub
return "Circle";
}
}
class Square extends Shape{
@Override
public String toString() {
// TODO Auto-generated method stub
return "Square";
}
}
class Triangle extends Shape{
public String toString() {
return "Trangle";
}
}
class Rhomboid extends Shape{
public String toString() {
return "Rhomboid";
}
}
public class Shape3 {
public static void main(String[] args) {
List<Shape> shapeList = Arrays.asList(new Circle(),new Square(),new Triangle(),new Rhomboid());
for(Shape s:shapeList) {
s.draw();
}
Rhomboid r = new Rhomboid();
((Shape)r).draw();
// 无法转换的类型
// ((Circle)r).draw();
}
}
练习7
package thinking.java.chapter13;
class Candy{
static {
System.out.println("load candy");
}
}
class Gum{
static {
System.out.println("load gum");
}
}
class Cookie{
static {
System.out.println("load cookie");
}
}
public class SweetShop {
public static void main(String[] args) {
if(args.length<1) {
System.out.println("usage:sweetname");
System.exit(0);
}
Class c = null;
try {
c = Class.forName(args[0]);
System.out.println("enjoy:"+args[0]);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
:
练习8:
package thinking.java.chapter13;
class A{}
class B extends A{}
class C extends B{}
public class Demo08 {
public static void printSuperClass(Object o) {
if(o.getClass().getSuperclass()!=null) {
System.out.println(o.getClass()+" is a subclass of "+o.getClass().getSuperclass());
}
try {
printSuperClass(o.getClass().getSuperclass().newInstance());
} catch(InstantiationException e) {
System.out.println("Unable to instantiate obj");
} catch(IllegalAccessException e) {
System.out.println("Unable to access");
}
}
public static void main(String[] args) {
printSuperClass(new C());
}
}
练习10:
package thinking.java.chapter13;
public class Exe10 {
public static void main(String[] args) {
//char数组是一个对象
char[] c = new char[10];
System.out.println("superClass:"+c.getClass().getSuperclass());
System.out.println("c instaneof object:"+(c instanceof Object));
}
}