浅谈java.lang.Class与反射

    学习java语言经常会说一切皆对象(基本数据类型除外)

    那么我们写的类是对象吗?如果是对象,它是谁的对象?我们知道类是对对象的抽象,对象是类的实例(具象)。那么有没有一个类是所有其它类的高度抽象呢?答案是有,它就是java.lang.Class类(extends Object类)

初步了解一下java.lang.Class类:

其构造方法声明为private,因此只能由java虚拟机调用并构建实例化对象,无法如普通类一样使用new关键字创建对象。

但是仍然有三种方式得到Class对象

每当编写并编译了一个新类,就会产生一个Class对象,保存在同名的.class文件中

如何才能获取一个新编写类的Class对象

假设编写了一个普通的音乐类Music

public class Music{

public Music(){ }

Music mc=new M usic();//实例化一个对象

}

则可以通过以下几种方式:

(1)、直接调用Class类的静态成员class(每一个类都有该static成员)(同样适用于接口、数组及基本数据类型)

Class c1=Music.class;

(2)、通过Music类的对象调用Class类的动态方法getClass()

Class c2=mc.getClass();

(3)、通过调用Class类的静态方法forName()

Class c3=Class.forName("Music");//需要类的全名,包括包名

一般将C1,c2,c3称为某个普通类的类类型

反射:

new 关键字对象实例化,属于静态加载,在编译时就进行类型检查,如果找不到相关类就无法通过编译。

另有一种实例化对象的方法属于动态加载,在运行时进行类型检查。该方法就是通过某个类的类类型(Class对象)实例化该类的对象:

Music mc1=(Music)c1.newInstance();

先总结到这,理解的还不透彻;今后深入理解了,再改进吧。这是一个初步的不成熟的理解。

你可能感兴趣的:(浅谈java.lang.Class与反射)