java.lang.Class:是反射的源头。创建一个类,通过编译,生成.class文件。之后使用java.exe加载(JVM的类加载器)加载此.class文件。加载到内存以后,就是一个运行时类,存在缓冲区。那么这个运行时类本身就是一个Class的实例。
1. 一个运行时类只加载一次
2. 有了Class的实例以后,才可以进行如下操作
1)创建对应的运行时类的对象
2)获取对应的运行时类的完整结构(属性,方法,构造器…)
3)获取对应的运行时类的指定结构(属性,方法,构造器)
4)反射的应用:动态代理
获取Class类的实例
package lianxi1; import org.junit.Test; public class TestReflection { //如何获取Class的实例 @Test public void test1() throws ClassNotFoundException{ //1.通过运行时类本身的class属性 Class clazz1 = Person.class; System.out.println(clazz1.getName()); //2.通过运行时类的对象获取 Person p = new Person("foj",23); Class clazz2 = p.getClass(); System.out.println(clazz2.getName()); //3.通过Class的静态方法获取,体现反射的动态性 String s1 = "lianxi1.Person"; Class clazz3 = Class.forName(s1); //clazz3.newInstance(); System.out.println(clazz3.getName()); //4.通过类的加载器 ClassLoader classloader = this.getClass().getClassLoader(); Class clazz4 = classloader.loadClass(s1); System.out.println(clazz4.getName()); } }
读取配置文件:
@Test public void test2() throws IOException{ //1.读取包中配置文件 ClassLoader classloader = this.getClass().getClassLoader(); InputStream is = classloader.getResourceAsStream("lianxi1\jdbc.file1"); //2.读取工程下的配置文件 // InputStream is = new FileInputStream(new File("jdbc.file2")); Properties p = new Properties(); p.load(is); String acc = p.getProperty("account"); String pwd = p.getProperty("password"); System.out.println(acc+" "+pwd); }