Java基础之反射

来源:互联网 发布:淘宝优惠券自动发送 编辑:程序博客网 时间:2024/06/07 04:56
反射(主要用到的类Class、Package、Field、Constructor、Method、Array)
    *对象有编译类型和运行类型。
        Object obj=new Date(); //编译类型Object,运行类型为Date类型
        Date date=(Date)obj;//必须得进行强制转化才能调用Date类型的方法。
    *反射就是得到某个类中所有成员的一种方式。
    *Class类描述所有的类,Class的实例描述的就是类(也指的是jvm中的一份字节码)。
    *Class:用于描述一切类、接口。
           Class clz=Date.class;//clz表示的是Date的字节码
           Class clz1=String.class;//clz1表示的是String的字节码
           //区分是那种类型的字节码(用泛型表示)
           Class<Date> clz=Date.class;
           Class<String> clz1=String.class;
    *创建Class对象(获取Class实例,返回的是全限定类名(包+类名))
        //方法1
        MyObject obj=new MyObject();
        Class c1=obj.getClass();  //获取MyObject类的字节码,默认使用了泛型
        //方法2
        Class<?> c2=Class.forName("java.lang.String");//字符串必须是全类名(包+类名),<?>表示不知道返回类型。
        //方法3
        Class c3=String.class; //类名.class(获取一份字节码)
        *同一份字节码在jvm中有且只有一份(一个类在虚拟机中只有一份字节码)。
    *常用方法
        getPackage()  //获取Class对象所对应实体所在包的信息描述类的一个对象。返回Package对象
        getModifilers();//返回Class对象所对应实体用整数表示的类修饰符值。
        getName();//获取Class对象所对应实体的完全限定名。
        getSuperClass();//获取Class对象所对应的实体的直接父类的Class对象。
        getInterfaces();//获取Class对象所对应的实体实现的所有接口的Class对象数组。
        getFields();//获取Class对象所对应实体的所有public字段。
        getDeclaredFields();//获取所有字段
        getConstructors();//获取Class对象所对应实体的所有public的构造方法。
        getDeclaredConstrucotrs();//获取所有构造方法。
        getmathods();//获取Class对象所对应的实体的所有public方法。
        getDeclaredMethods();//获取所有方法
    *Java默认实现的9大内置Class对象(八大基本数据类型和void关键字)
        byte  short int long float double char boolean void(关键字)
        *对应Class对象
            byte.class   int.class   char.class   void.class ....  
        *八大基本数据类型多所对应的包装类中都有一个常量:TYPE
         TYPE表示的是该包装类所对应的基本数据类型的Class实例
           System.out.println(Integer.TYPE==int.class);//返回true
    *通过构造器创建对象
           //方法1(带参数构造器只能使用此方式)
              Class clz=User.class;    //找到类字节码
              Constructor<User> c=clz.getConstructor();//找到被调用的指定构造器
              User user=c.newInstance();  //执行该构造器
              //传递参数
              Class clz=User.class;    
              Constructor<User> c=clz.getConstructor(String.class);
              User user=c.newInstance("fanqifu");
             //用反射的好处
                  可以在只知道全限定名的情况下可以创建对象
                       Class.forName("全限定名");
           //方法2
              //直接使用Class对象的newInstance()方法(公共(public)的无参数构造器创建对象)。
              Class clz=User.class;
              User user=clz.newInstance();//相当于new创建对象
           //方法3 :调用私有的构造器创建对象需要忽略掉安全检查
              Class clz=User.class;    
              Constructor<User> c=clz.getDeclaredConstructor(String.class,int.class);
              c.setAccessible(true);//忽略安全检查(私有类型的安全检查)
              User user=c.newInstance("laofan",21);
              *安全访问类
                 类AccessibleObject 子类Constractor、Field、Method(表示可以设置构造器,成员变量和成员方法的安全访问属性)。
                  使用setAccessible(true)方法设置是否可以访问,true表示可访问。
0 0