java.lang.Class是反射的源头,我们创建了一个类(源文件),通过编译(javac.exe),生成对应的.class文件,之后我们使用java.exe加载(使用的是JVM的类加载器来完成的)此.class文件加载到内存以后就是一个运行时类,存放在缓存区。那么这个运行时类本身就是一个Class的实例。 1.每一个运行时类只加载一次
2.有了一个Class的实例以后,我们才可以进行如下的工作:
(1)创建对应的运行时类的对象
(2)获取对应的运行时类的完整结构(属性、方法、构造器、内部类、父类、所在的包、异常、注解等)
(3)调用对应的运行时类的指定的结构(属性、方法、构造器)
(4)反射的应用,动态代理 Person p = new Person(); Class claaa = p.getClass();//通过运行时类的对象,调用其getClass(),返回其运行时类
如何获取Class的实例(3种)
1.调用运行时类本身的.class属性 Class claaa = Person.class; System.out.println(claaa.getName());
2.通过运行时类的对象获取 Person p = new Person(); Class claaa = p.getClass();
3.通过Class的静态方法获取,通过此方式可以体会到反射的动态性 String className = "com.at.java.Person" Class class = Class.forName(className);(要抛出一个ClassNotFoundException)
4.(该方式了解就可以)通过类的加载器 ClassLoader classLoader = this.getClass.getClassLoader();(this是指当前的方法) Class claaa = classLoader.loadClass(className); **关于类的加载器:** **ClassLoder classLoder1 = ClassLoder.getSystemClassLoder();(系统类加载器)** **ClassLoder classLoder2 = classLoder1 .getParent();//可以获取类加载器classLoder1 的父类(扩展类加载器)** **
当一个文件不是直接放在工程下而是放在具体的某个包下时,想获取文件内容可以写如下代码:** 创建对应的运行时类的对象,使用newInstance(),实际上就是调用了运行时类的空构造器 要想能够成功创建,
掌握如下:
ClassLoader loder = this.getClass().getClassLoader();
InputStream is = loader.getResourceAsStream("com\\atguigu\\java\\jdbc.prop")
Properties pros = new Properties();
pros.load(is)
1.要求对应的运行时类要有空参的构造器
2.构造器的权限修饰符要足够