java反射之Class初级用法

来源:互联网 发布:单片机工作过程 编辑:程序博客网 时间:2024/06/01 16:56

Class类

Class类的实例表示java应用运行时的类或接口(每个java类在运行的时候都会在JVM里表现为一个Class对象,可以通过类名.Class类型.getClass()Class.forName("包.类名")等方法获取Class对象)

Class类的特点

Class类的父类是Object,事实上,任何java类,不管是jdk里面的还是自定义的,都是Class类的对象,同时,所有的数据类型、关键字、方法等等,一切的一切都是Class类的对象。这是前提,很关键

Class类的运行原理

java种创建对象时不是通过类直接创建的,一个类的对象被创建之前,首先JVM会加载该类的字节码文件(.class文件),也就是编译后的java程序文件;加载完成后,JVM会自动的为该类创建自己的Class对象,再通过Class对象创建目标对象

使用Class的目的

很简单的一句话,可以利用反射机制重新获取到Object对象,这个是动态加载类以及对象的,是在程序运行时才会发生的动作,至于反射机制的具体应用,先挖个坑,以后填

API文档的仿制

按照Class类的特性,java种的一切都是Class类的对象,我们可以获取到这些“对象”的信息,比如任意类的属性、构造方法、所有方法等等信息,诚然,我们甚至可以做出一个API文档

public static void main(String[] args) throws ClassNotFoundException{        // 1.返回与带有给定字符串名的类或接口相关联的 Class 对象,直接导致该类被初始化        Class testClass = Class.forName("java.lang.Class");        // 2. 获取该类的实例化对象        Class testClass2 =  Class.class;        // 3.获取该类的实例化Class对象        Class testClass3 = new Test().getClass();        String target = "([a-zA-Z_-]+)\\."; // 需要匹配的正则表达式,表示了形如“字母+.”的模式,这样便去除了某个类的包名前缀        Class<? super Object> superC = testClass.getSuperclass();        String name = superC.getName();        System.out.print("Class的父类是:" + name.replaceAll(target, "") + "\n");        Constructor<Class>[] consClass = testClass.getDeclaredConstructors();        System.out.println("Class的构造方法有:");        for(Constructor con : consClass){            name = con.toString();            name = name.replaceAll(target, "");            System.out.println(name);        }        Class<Class>[] classes = testClass.getClasses();        System.out.println("Clsass所有的成员的公共类和接口:");        if(classes.length==0)            System.out.println("null");        for(Class cla : classes){            name = cla.toString();            name = name.replaceAll(target, "");            System.out.println(name);        }        System.out.println("Class的属性是:");        Field[] fields = testClass.getDeclaredFields();        for(Field f : fields){            name = f.toString();            name = name.replaceAll(target, "");            System.out.println(name);        }        Method[] methods = testClass.getMethods();        System.out.println("Class的所有方法是:");        for(int i=0; i<methods.length; i++){            name = methods[i].toString();            name = name.replaceAll(target, "");            System.out.println(name);        }        ClassLoader loader = testClass.getClassLoader();// 如果对象是基本类型或者是void,则返回null        System.out.println("Class的类加载器是:" + loader);

这只是一个简单的思路介绍,重要的是从0到1的过程,至于怎么从1到n,这需要更多的努力。

0 0
原创粉丝点击