欢迎选择我的课程,让我们一起见证您的进步~~
我们编写java代码,源文件使用以java为后缀命名,java文件编译后对应的以.class后缀命名;当java虚拟机记载的时class文件,这些文件在虚拟机中必须以某种数据结构的形式存在,来表示对应的class的各种结构及数据,那么这个结构形式就是Class对象,它是对Class的一种描述而Object是Class对象实例化的结果,在JVM中Class类对象只会有1份(同一个ClassLoader加载的,放在JVM的固定内存区域中,GC不会对其进行管理),但是可以有不同的多个实例对象存在
一个类的方法必须依赖一个具体的实例才可以被调用(除了静态方法),因为其要依赖具体实例的数据及状态~~~
类对象Class和方法对象Method也是Object,有自己的属性和方法。类只有实例化为一个对象,才可以调用对象的实例方法,Class对象是Class类的一个实例。
一个Class对象不是class本身,可以认为它是一个用来访问实际class的界面。
invoke一个实例方法需要一个那个类的实例. invoke一个static方法时就可以传null进去。
1.我也解释不清楚2.A这个方法是成员方法,如果没有实例化的对象是不能调用的,如果是静态方法就不需要了
Class是类对象,它当然也继承于Object。这个类对象比较区别于具体的实例对象,一般情况下一个类只有一个类对象,我们可以通过Just.class(这是其中一个办法,差不多有三种办法其实)获得的。使用new或newInstance可以创建多个实例对象。建议题主看看反射入门知识,然后自己体会类对象的概念,这个是反射的基础。
Class
Object
Just.class
new
newInstance
class对对象的抽象,对象(Object)对客观事物的抽象
首先,Class用于抽象 类的信息,java是面向对象的,比如人这个类,Person,它可以抽象出姓名,性别,年龄等信息;而java提供对于类的抽象,java的类抽象成了Class类,它抽象了包名、类名、属性数组、方法数组等信息,这就是更高一层的抽象了。这样就好理解反射了,Class<?> c = Just.class;这里的c就是Class的一个对象了,这个对象实例中包含的是Just类,但是你要获取Just类的实例就还要调用c.newInstance()方法了。
您这里有2个提问:第1个是实例与类之间关系的问题。这就好比模具与产品之间的关系,比如我们用一个做饼的模具做饼,用模具就好比类,用模具一压就生产出一个饼,每个饼的形状都是一样的,这是产品;模具的作用是使每个饼的大小等属性都一样。而反射的概念更加复杂,它描述的是连模具本身也有属性,比如这个模具有多大,多深,那么类本身也是类似,这个类有什么方法,哪些属性?如果知道了这些东西,就可以动态地实例化对象。我知道了这个模具的属性有哪些行为之后,也可以动态地生产饼,并且调用这个饼的方法;第2个问题:因为用反射也要实例化对象,虽然没有用new,但也得实例化,不然报空指针。
看到问题都解决了,不过我还是从内存结构的层面来补充一下。
我们来看一下实例的在堆内存的结构:
即每个对象实例在 heap 内存中有4部分组成,重点说一下标志位信息(mark word)和 Class 实例指针,标志位信息包括是否有锁,GC 标志位,Youth GC 次数等信息。
Class 实例代表的是一个已经被 Classloader 加载到 jvm 的类,它存储了这个类的描述信息,类名,字段名和方法信息等。
Classloader
所以楼主的问题也就清楚了,一个 Class 实例只是表示类的描述信息,它并不能等于类的实例,而每个实例会包含一个 Class 实例的指针引用。
通常调用 Class.newInstance() 会做3件事情:
Class.newInstance()
1.开辟一个堆内存空间2.调用对应类的无参构造方法3.申请栈的地址,将引用地址指向这个堆内存空间
补充,Class 的实例化由 classloader的 define() 方法来进行。
classloader
define()
我们编写java代码,源文件使用以java为后缀命名,java文件编译后对应的以.class后缀命名;
当java虚拟机记载的时class文件,这些文件在虚拟机中必须以某种数据结构的形式存在,来表示对应的class的各种结构及数据,那么这个结构形式就是Class对象,它是对Class的一种描述
而Object是Class对象实例化的结果,在JVM中Class类对象只会有1份(同一个ClassLoader加载的,放在JVM的固定内存区域中,GC不会对其进行管理),但是可以有不同的多个实例对象存在
一个类的方法必须依赖一个具体的实例才可以被调用(除了静态方法),因为其要依赖具体实例的数据及状态~~~
类对象Class和方法对象Method也是Object,有自己的属性和方法。
类只有实例化为一个对象,才可以调用对象的实例方法,Class对象是Class类的一个实例。
一个Class对象不是class本身,可以认为它是一个用来访问实际class的界面。
invoke一个实例方法需要一个那个类的实例. invoke一个static方法时就可以传null进去。
1.我也解释不清楚
2.A这个方法是成员方法,如果没有实例化的对象是不能调用的,如果是静态方法就不需要了
Class
是类对象,它当然也继承于Object
。这个类对象比较区别于具体的实例对象,一般情况下一个类只有一个类对象,我们可以通过Just.class
(这是其中一个办法,差不多有三种办法其实)获得的。使用new
或newInstance
可以创建多个实例对象。建议题主看看反射入门知识,然后自己体会类对象的概念,这个是反射的基础。
class对对象的抽象,对象(Object)对客观事物的抽象
首先,Class用于抽象 类的信息,java是面向对象的,比如人这个类,Person,它可以抽象出姓名,性别,年龄等信息;而java提供对于类的抽象,java的类抽象成了Class类,它抽象了包名、类名、属性数组、方法数组等信息,这就是更高一层的抽象了。
这样就好理解反射了,Class<?> c = Just.class;这里的c就是Class的一个对象了,这个对象实例中包含的是Just类,但是你要获取Just类的实例就还要调用c.newInstance()方法了。
您这里有2个提问:
第1个是实例与类之间关系的问题。这就好比模具与产品之间的关系,比如我们用一个做饼的模具做饼,用模具就好比类,用模具一压就生产出一个饼,每个饼的形状都是一样的,这是产品;模具的作用是使每个饼的大小等属性都一样。而反射的概念更加复杂,它描述的是连模具本身也有属性,比如这个模具有多大,多深,那么类本身也是类似,这个类有什么方法,哪些属性?如果知道了这些东西,就可以动态地实例化对象。我知道了这个模具的属性有哪些行为之后,也可以动态地生产饼,并且调用这个饼的方法;
第2个问题:因为用反射也要实例化对象,虽然没有用new,但也得实例化,不然报空指针。
看到问题都解决了,不过我还是从内存结构的层面来补充一下。
我们来看一下实例的在堆内存的结构:
即每个对象实例在 heap 内存中有4部分组成,重点说一下标志位信息(mark word)和
Class
实例指针,标志位信息包括是否有锁,GC 标志位,Youth GC 次数等信息。Class
实例代表的是一个已经被Classloader
加载到 jvm 的类,它存储了这个类的描述信息,类名,字段名和方法信息等。所以楼主的问题也就清楚了,一个
Class
实例只是表示类的描述信息,它并不能等于类的实例,而每个实例会包含一个Class
实例的指针引用。通常调用
Class.newInstance()
会做3件事情:1.开辟一个堆内存空间
2.调用对应类的无参构造方法
3.申请栈的地址,将引用地址指向这个堆内存空间
补充,
Class
的实例化由classloader
的define()
方法来进行。