
参考地址: 1. http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html2. http://www.cnblogs.com/nerxious/archive/2012/12/24/2829446.html3. http://j2megame.blog.163.com/blog/static/140838396201141623654269/4. http://blog.csdn.net/liujiahan629629/article/details/18013523
java.lang.Class 是反射的源头
我们创建了一个类, 通过编译(javac.exe)生成对应的.class文件, 之后我们使用java.exe加载此.class文件(JVM的类加载器完成的), 此.class文件加载到内存后,就是一个运行时类,存在于缓存区,那么这个运行时类本身就是一个Class的实例! 每一个运行时类只加载一次 反射的类的获取方式共有4种1. 通过类的.class属性2. 通过类的对象的getClass()方法3. 通过Class类的静态forName()方法4. 通过类的加载器
package learn.JavaBasics.Class; import java.io.*; import java.util.Properties; class Person{ public String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } public class TestReflection { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, FileNotFoundException { //方法1 Class<Person> clazz = Person.class; Person p = clazz.newInstance(); //上面是使用了泛型的,也可以不用泛型,然后类型强转 Class clazz1 = Person.class; Person p1 = (Person) clazz1.newInstance(); //方法2 Person p2 = new Person(); Class clazz2 = p2.getClass(); //方法3 Class clazz3 = Class.forName("learn.JavaBasics.Class.Person"); Person p3 = (Person) clazz3.newInstance(); Class<?> clazz3_1 = Class.forName("learn.JavaBasics.Class.Person"); Person p3_1 = (Person) clazz3_1.newInstance(); //方法4 Class clazz4 = new TestReflection().testClassLoaderReflection(); Person p4 = (Person) clazz4.newInstance(); //关于加载Properties文件的问题 new TestReflection().testProperties(); } public Class<?> testClassLoaderReflection() throws ClassNotFoundException { ClassLoader cl = this.getClass().getClassLoader();//this代表的是这个方法,所以不能使用main方法 Class<?> c = cl.loadClass("learn.JavaBasics.Class.Person"); return c; } public void testProperties() throws FileNotFoundException { //1. 如果不在同一个包文件下 ClassLoader loader = this.getClass().getClassLoader(); InputStream in = loader.getResourceAsStream("learn//JavaBasics//Class//jdbc.properties");//前面是包的名字 //2. 在一个包文件下 FileInputStream in1 = new FileInputStream(new File("jdbc1.properties")); Properties p = new Properties(); try { p.load(in); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } p.getProperty("driver"); } }
调用默认的newInstance方法,要求被反射的类要有一个无参的构造方法,同时这个无参的构造方法的访问权限也要注意,要能够访问如果没有无参构造方法,只要正确的调用其他的构造方法也可反射类
动态代理