java反射之Class初级用法

2 篇文章 0 订阅
2 篇文章 0 订阅

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值