java反射系列二
一.Class类
package reflect; /* *java.lang.class是反射的源头 *我们创建了一个类,通过编译(javac.exe),生成对应的.class文件,之后我们使 *用java.exe加载(JVM的类加载器完成的)此.class文件 *此.class文件加载到内存以后,就是一个运行时类存在缓存区,那么这个运行时 *类本身就是一个Class的实例 *1.每个运行时类只能加载一次 *2.有了Class的实例以后,我们才可以进行如下的操作 * 1)创建对应的运行时类的对象 * 2)获取对应的运行时类的完整结构(属性.方法.构造器.内部类.父类.所在的包.异常...) * 3)调用对应的运行时类的指定结构(属性.方法.构造器) * 4)反射的应用:动态代理 */ public class TestReflections { public static void main(String[] args) throws ClassNotFoundException { TestReflections t = new TestReflections(); t.test(); } //如何获取Class的实例(掌握三种) public void test() throws ClassNotFoundException { //1.调用运行时类本身的.class属性 Class cla = Person.class; //getName() 返回由 类对象表示的实体(类,接口,数组类,原始类型或空白)的名称,作为 String 。 System.out.println(cla.getName()); //2.通过运行时类的对象获取 Person p = new Person(); Class claz = p.getClass(); System.out.println(claz.getName()); //3.通过class的静态方法获取 String className = "reflect.Person"; //forName(String className)返回与给定字符串名称的类或接口相关联的 类对象。 Class clazz = Class.forName(className); System.out.println(clazz); //4.通过类的加载器 //getClassLoader() 返回类的类加载器。 ClassLoader classloader = this.getClass().getClassLoader(); //loadClass(String name)用指定的binary name 加载课程 Class clazzs = classloader.loadClass(className); System.out.println(clazzs.getName()); } }