zoukankan      html  css  js  c++  java
  • 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());
            
            
    */        
            
            
        }

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

  • 相关阅读:
    指针问题,p+i什么意思i代表什么
    怎么用C语言写一个飞机程序
    switch()语句中()中必须是常量吗
    一元二次方程运行结果中输入上系数后总显示输入不合法无论系数可以得出实根
    我想学号图论求大神请教
    c-freelib库
    十进制转十六进制问题(有代码)
    关于逐个读取同一目录下txt文本的问题
    JAVA-JDK1.7-ConCurrentHashMap-测试和验证
    JAVA-JDK1.7-ConCurrentHashMap-源码并且debug说明
  • 原文地址:https://www.cnblogs.com/excellencesy/p/8868567.html
Copyright © 2011-2022 走看看