• java-Reflect


    一、Class类

    (1)在面向对象的世界里,万事万物皆对象【包括类】。

      在java语言中,有两种事物不是对象:静态成员,普通数据类型。(但是呢,普通数据类型都有与之对应的包装类)

      静态的成员,它是属于类的,不是属于对象的。

      类是对象,类是java.lang.Class的对象。

    (2)”类“这个对象给如何表示呢?

    上面是Java.lang,Class的源代码,可以看出:他只允许JVM创建该类的实例

    Class类实例的三种表现方式:

        //第一种
        Class foo1=Foo.class;
        //第二种
        Foo foo=new Foo();
        Class foo2=foo.getClass();
        //第三种
        Class foo3=null;
        try {
             foo3=Class.forName("songyan.test.Foo");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    这三种变现形式获得的是同一个对象

       System.out.println(foo1);
        System.out.println(foo2);
        System.out.println(foo3);
        System.out.println(foo1==foo2);
        System.out.println(foo3==foo2);

    运行结果:

    (3)通过类的类类型创建对象

    //通过类的类类型创建对象
        try {
            Foo foo4=(Foo) foo1.newInstance();//需要有无参数的构造方法【他会去调用无参数的构造方法】
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

     二、Class动态加载类的用法

    (1)动态加载与静态加载

      静态加载:编译时期加载

      动态加载:运行时记载,例:Class.forName("类的全称")

    package com.songyan.reflect;
    
    /**
     * Class 类类型
     * @author sy
     *
     */
    public class Demo1 {
        public static Class getClasses()
        {
            Demo demo=new Demo();
            Class class1=null;
            //第一种方式
            //class1=Demo.class;
            //第二种方式
            //class1=demo.getClass();
            //第三种方式
            /*try {
                class1=class1.forName("com.songyan.reflect.Demo");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }*/
            return class1;
        }
    }
    
    class Demo
    {
        void method1(){}
        void method2(){}
        void method3(){}
        
    }
    /**
    *什么是字节码
    *当在源程序中用到Demo这个类时,首先要在硬盘上把这个类的代码编译成二进制的字节码文件,
    *然后把这个二进制的字节码文件加载到内存中,形成字节码对象
    *这字节码对象就可以创建Demo这个类的对象
    **/
    
    /**
     * Class.forName()的作用:返回指定类的字节码
     * 返回方式有两种:
     * 1,如果内存中有该字节码对象,就直接返回
     * 2,如果内存中没有该字节码文件对象
     * 就由编译器编译源代码,生成字节码文件,
     * 再由类加载器将字节码文件加载到内存,生成字节码对象
     * 返回该对象
     * 
     */
    
    /**
     * 得到类的字节码的三种方式
     * Demo.class
     * demo.getClass()
     * class1.forName("com.songyan.reflect.Demo")
     * 三种方式获得的同一个类的字节码,是同一个对象。
     */
    
    /**Class类的九个预定义Class实例对象
     * 八个基本数据类型。
     * 他们也有对应的Class对象
     * void 也有对应的class对象void.class
     */
    
    /**
     * 只要是源程序中出现的类型,都有与之对应的实例对象
     * 例如:int[],void
     */

    三、Class类的方法

    判断对应类是否是基本数据类型:isPrimitive()
    获得包装类对应得基本数据类型的字节码:Integer.TYPE
    判断对应类是不是数组:isArray()
    public static void test()
        {
            String str="abc";
            Class cl1=String.class;
            Class cl2=str.getClass();
            Class cl3=null;
            try {
                cl3=Class.forName("java.lang.String");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            /*System.out.println(cl1==cl2);
            System.out.println(cl1==cl3);*/
            //是否是基本数据类型
            System.out.println(cl1.isPrimitive());
            Class cl4=int.class;
            System.out.println(cl4.isPrimitive());
            //包装类不属于基本数据类型
            Class cl5=Integer.class;
            System.out.println(cl5.isPrimitive());
            //基本数据类型的包装类.TYPE返回该类对应的基本数据类型的字节码
            cl5=Integer.TYPE;
            System.out.println(cl5.isPrimitive());
            //判断该类是不是数组
            System.out.println(int[].class.isArray());
            
            
            
        }
    获得对应类的方法:getMethods()
    获得对应类的完整类名:getName()
    获得对应类实现的接口:getInterfaces()
    获得对应类所在的包:getPackage()
    public static void main(String[] args)
        {
            test();
            /*Demo demo=new Demo();
            Class class1=getClasses();
            
            System.out.println("name::::"+class1.getName());*/
            /*System.out.println("************");
            for(int i=0;i<class1.getMethods().length;i++)
            {
                System.out.println(class1.getMethods()[i]);
            }
            System.out.println("************");
            for(int i=0;i<class1.getInterfaces().length;i++)
            {
                System.out.println(class1.getInterfaces()[i]);
            }
            System.out.println("************");
            System.out.println("package::::"+class1.getPackage());
            
            
    */        
            
            
        }

     四、构造方法的反射的应用

  • 相关阅读:
    【阿里聚安全·安全周刊】苹果证实 iOS 源代码泄露|英国黑客赢下官司
    150万元重奖!阿里软件供应链安全大赛正式启动
    【阿里聚安全·安全周刊】山寨外挂有风险养蛙需谨慎|健身追踪热度图爆军事基地位置
    移动APP外挂攻防实战
    阿里云正式上线移动直播问答解决方案,助力APP尽情“撒币”!
    阿里安全资深专家杭特辣评中国网络安全人才之“怪现状”
    【阿里聚安全·安全周刊】Intel芯片级安全漏洞事件|macOS存在漏洞
    阿里聚安全年终盘点|2017互联网安全领域十大话题
    【技术分析】DowginCw病毒家族解析
    独家探寻阿里安全潘多拉实验室,完美越狱苹果iOS11.2.1
  • 原文地址:https://www.cnblogs.com/excellencesy/p/8868567.html
Copyright © 2020-2023  润新知