java学习
反射
- 解释
说的是程序在运行期间借助反射API取得任意类的内部信息。去获得对应对象的内部属性和方法。任何类在被JVM加载之后会产生有一个对应的Class对象,这个Class包含被加载类的全部结构信息。
/通过反射获取类的class对象
public class T {
public static void main(String[] args) throws ClassNotFoundException {
Class c1 = Class.forName("Test.T");
System.out.println(c1);
Class c2=Class.forName("Test.T");
Class c3=Class.forName("Test.T");
Class c4=Class.forName("Test.T");
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());
System.out.println(c4.hashCode());
}
}
运行结果:
class Test.T
1846274136
1846274136
1846274136
一个类在内存中只会存在一个class对象,并且在加载后会封装在class对象中
- 使用
正常方式:引入需要的"包类"名称->通过new实例化->取得实例化对象
反射方式:实例化对象->getClass()方法->取得完整的"包类"名称
- 功能
java反射机制提供的功能:
- 在运行时判定任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判定任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
- 创建
方式一:
Class c1=person.getClass();
方式二:
Class c2=Class.forName("Test.t2");
方式三:
Class c3=Student.class;
方式四;
Class c4=c1.getSuperclass()
- 什么类可以有class对象
1.interfance 接口
2.[] 数组:只要元素类型与维度一样,就是同一class
3.enum 枚举
4.class :外部类,成员内部类,静态内部类,局部内部类,匿名内部类
5.primitive type:基本数据类型
6.void
- 类的加载过程
要是类未被加载到内存中,系统则会通过三个步骤对类初始化
1.将类的class文件读入内存,为之创建java.lang.Class对象。
2.将类的二进制数合并到JRE。
-
JVM对类初始化
<clinit>(){ m=300; m=100; }
- 类的初始化
主动引用,会发生类的初始化
- new一个类的对象
- 调用类的静态成员和静态方法
- 反射调用
被动引用,不会发生类的初始化
- 引用常量不会发生初始化
- 访问静态域
- 类加加载器
- 引导类加载器
- 扩展类加载器
ClassLoader p=parent.getParent();
- 系统类加载器
ClassLoader=class.forName("java.lang.Object").getClassLoader;
- 获取系统类加载器可以加载的路径
System.getProperty("java.class.path");
还有写项目