JAVA反射概述

反射概述:
   反射是指对于任何一个Class类,在”运行的时候“都可以直接得到这个类全部的成分。
   在运行时,可以直接得到这个类的构造器对象:Constructor
   在运行时,可以直接得到这个类的成员变量对象:Field
   在运行时,可以直接得到这个类的成员方法对象:Method
   这种行动时动态获取类信息以及动态调用类中成分的能力成为JAVA语言的反射机制。

 反射的关键:
   反射的第一步都是先得到编译后的Class类对象,然后就可以得到Class的全部成分。
   HelloWorld.java->javac->HelloWorld.class
   Class c =HelloWorld.class;

 反射的基本作用,关键?
    反射在运行时获取类的字节码文件对象:然后可以解析类中的全部成分。
    反射的核心思想和关键就是:得到编译以后的class文件对象

 ---------------------------------------------------------------------
 反射第一步:获取Class类的对象
          编译                      内存       创建对象
 java文件————————>Class文件         Class对象—————————————>new Student()
                (字节码文件)
——————————————————————————
    源代码阶段                      Class对象阶段             Runtime运行阶段
       |                                |
  Class类中的静态方法                2.类名.class            3.对象.getClass()
        |
 1.forName(String className)
 *********************************************************************
            内存
   ——————————————————————————————————————————————————
   |  Class对象      Student.class   (第一步:获得class对象) |
   |  ——————————————————————————————————————————    |
   |   |  [private String name; private int age]|——————————>Field
   |   |[空参构造;带参构造]                        |<———————Constructor(第二部:获得                                  ................................................Constructor对象)——>(第三步:创建对象)
   |   |[成员方法]                                  |——————————>Method
   |   |                                        |   |
   |   |——————————————————————————————————————  |   |
   |————————————————————————————————————————————————
*******************************************************************************
 反射的第一步是?
   获取Class类对象,如此才可以解析类的全部成分
   获取Class类的对象的三种方式
   1:Class c1=Class.forName("全类名")
   2:Class c2=类名.class
   3:Class c3=对象.getClass()

 使用反射技术获取构造器对象并使用
    反射的第一步是先得到类对象,然后从类对象中获取类的成分对象
    Class类中用于获取构造器的方法
       方法                                                           说明
 Constructor<?>[]getConstructors()                                   返回所有构造器对象的数组(只能public)
 Constructor<?>[]getDeclaredConstructors()                           返回所有构造器对象的数组(存在就能拿到)
 Constructor<T>getConstructor(Class<?>...parameterTypes)             返回单个构造器对象(只能public)
 Constructor<T>getDeclaredConstructor(Class<?>...parameterTypes)     返回单个构造器对象,存在就能拿到

使用反射技术获取构造器对象并使用
   获取构造器的作用依然是初始化一个对象返回

    ConStructor类中用于创建对象的方法
               符号                                说明
 T newInstance(Object...initargs)           根据指定的构造器创建对象
 public void setAccessibile(boolean flag)   设置为true,表示取消访问检查,进行暴力反射

 总结:
      1.利用反射技术获取构造器对象的方式
       getDeclaredConstructors()
      getDeclaredConstructor(Class<?>...parameterTypes)
      2.反射得到的构造器可以做什么?
        依然是创建对象的
           public newInstance(Obj..initargs)
        如果是非public的构造器,需要打开权限(暴力反射),然后再创建对象
           setAccessible(boolean)
       *!!反射可以破坏封装性,私有的也可以执行

-----------------------------------------------------------------------------------------------------------

@Test
public void getConstructors() {
    //1.getConstructors:
    //获取全部的构造器,只能获取public修饰的
    //Constructor[]  getConstructors()
    //第一步:获取类多项
    Class c = Student.class;
    //第二步:提取类中全部的构造器对象(放到数组里面)(只能拿public)
    Constructor[] constructors = c.getConstructors();
    //第三步:遍历构造器
    for (Constructor constru :
            constructors) {                               //(参数个数)
        System.out.println(constru.getName() + "===>" + constru.getParameterCount());
    }
}

//2.getDeclaredConstructors();
//获取全部构造器,只要敢写,全部都能拿到,无所谓权限
@Test
public void getDeclaredConstructors() {

    //第一步:获取类多项
    Class c = Student.class;
    //第二步:提取类中全部的构造器对象(放到数组里面)(全部无所谓权限)
    Constructor[] constructors = c.getDeclaredConstructors();
    //第三步:遍历构造器
    for (Constructor constru :
            constructors) {                               //(参数个数)
        System.out.println(constru.getName() + "===>" + constru.getParameterCount());
    }
}

//3.getConstructor(Class..parometerTypes)
//获取某个构造器,只能拿public修饰的某个构造器
@Test
public void getConstructor() {

    //第一步:获取类多项
    Class c = Student.class;
    //第二步:定位单个构造对象(定位public无参构造器)
    Constructor cons = null;
    try {
        cons = c.getConstructor();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }


    System.out.println(cons.getName() + "===>" + cons.getParameterCount());

}

//4.getDeclaredConstructor
//获取某个构造器,只要你敢写,这里要能拿到,无所谓权限
@Test
public void getDeclaredConstructor() {

    //第一步:获取类多项
    Class c = Student.class;
    //第二步:定位全部无参构造对象(无所谓权限)
    Constructor cons = null;
    try {
        cons = c.getDeclaredConstructor();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }


    System.out.println(cons.getName() + "===>" + cons.getParameterCount());


    //5.定位某个有参构造

    try {
        cons = c.getDeclaredConstructor(String.class,int.class);
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }


    System.out.println(cons.getName() + "===>" + cons.getParameterCount());



}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值