1Java类加载机制和反射零散知识点

来源:互联网 发布:oracle误删除数据恢复 编辑:程序博客网 时间:2024/05/16 10:53

什么叫反射?Java程序可以动态地获取某个对象、某个类的运行时信息,并可以动态地创建Java对象,动态地调用Java方法,访问并修改指定对象的成员变量值。


JVM和类?开启一个程序,就启动了一个JVM进程,不同的JVM进程之间是不能共享资源。


类初始化:加载、连接、初始化三个步骤来对该类进行初始化三个步骤来对该类进行初始化。

           类的加载:将类的class文件读入内存。

           类的连接:把类的二进制数据合并到JRE中

           类的初始化:1 声明类变量时指定初始值 2 使用静态初始化块为类变量指定初始值。


类加载器:类的唯一标识:全限定类名(包括包名和类名)


Java运行时会出现两种类型:编译时类型和运行时类型。

Person  p=new Student();
在这种情况下,p变量在编译的时候是Person类型,在运行时是Student类型,如果需要解决这种做法

1 在编译时和运行时发现对象类型和类的真实信息

2 无法知道真实信息,程序只能依靠运行时信息来发现该对象和类的真实信息,此时需要用到反射知识。


如果想获得Class对象的信息:总共有三种方法

1 Class.forName("包名+类名")

package Collection;public class ArgsTest {//public static void main// public :main程序需要被JVM调用,需要被JVM自由调用这个main()方法,所以使用public 修饰符把这个方法暴露出来//static: 调用主方法的时候 ,JVM不可能先创建该主类的对象,然后通过该对象来调用该主方法,JVM直接通过该类来调用主方法//void:返回值,因为主方法被JVM调用,该方法返回值给JVM,此处没有任何意义public static void main(String[] args) throws ClassNotFoundException {System.out.println(args.length);for(String s: args){System.out.println(s);}System.out.println(Class.forName("Collection.ArrayExpression"));System.out.println(Class.forName("Collection.Ast"));/* * 0           class Collection.ArrayExpression           interface Collection.Ast */}}
找不到该就会抛出ClassNotFoundException。

2 调用对象的getClass()方法

public static void main(String[] args) throws ClassNotFoundException {String  s1="dsfafdsa";System.out.println(s1.getClass());
3 调用调用某个类的.class属性

public static void main(String[] args) throws ClassNotFoundException {String  s1="dsfafdsa";System.out.println(ArrayListTest.class);








 

原创粉丝点击