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());
    }
}

原文地址:https://www.cnblogs.com/zjm1999/p/10332230.html