• 反射第一部分,获取Class对象,获取Constructor对象


    反射是指针对任何一个Class类,在运行的时候都可以直接得到这个类的全部成分。

    在运行时,可以直接得到这个类的构造器对象:Constructor

    在运行时,可以直接得到这个类的成员变量对象: Field

    在运行时,可以直接得到这个类的成员方法对象 :Method

    这种运行时动态获取类信息以及调用类中成分的能力称之为java语言的反射机制。

    反射的关键:

    反射的第一步是先得到编译后的Class类对象,然后就可以得到Class的全部成分。

    反射的基本作用:

    反射是运行时获取类的字节码文件对象,然后可以解析类中的全部成分

    获取Class类对象的三种方法:

    1 Class  C1=Class.forName("全类名")

    2 Class   c2=类名.class

    3 Class c3=对象.getClass()

    1. package reflect;
    2. public class Test {
    3. public static void main(String[] args)throws Exception {
    4. //第一种方法
    5. Class c=Class.forName("reflect.Student");
    6. System.out.println(c); //输出class reflect.Student
    7. //第二种方法
    8. Class c1=Student.class;
    9. System.out.println(c1);//输出class reflect.Student
    10. //第三种方法,通过类对象
    11. Student s=new Student();
    12. Class c2=s.getClass();
    13. System.out.println(c2);//输出class reflect.Student
    14. }
    15. }

    使用反射技术获取构造器对象并使用

    第一步:获取Class 对象

    第二步: 获取Constructor对象

    第三步: 创建对象

    Class类中用于获取构造器的方法

    Constructor []  getConstructors()   返回所有构造器对象的数组(只能拿Public修饰的)

    Constructor[]  getDeclaredConstructors()  返回所有构造器对象的数组,存在就能拿到

    Constructor  getConstructor(Class  parameterTypes)  返回单个构造器(只能拿public修饰的)

    Constructor  getDeclaredConstructor(Class  paramterTypes) 返回单个构造器,存在就能拿到

    1. import java.lang.reflect.Constructor;
    2. public class Test {
    3. public static void main(String[] args) throws Exception{
    4. Class c=Teacher.class;//获取类对象
    5. //拿全部构造器(public修饰的)
    6. Constructor[] arr=c.getConstructors();
    7. for (Constructor constructor : arr) {
    8. System.out.println("构造器名称:"+constructor.getName()+"构造器参数个数:"+constructor.getParameterCount());
    9. }
    10. System.out.println("----------");
    11. //拿全部构造器,有就拿
    12. Constructor[] arr2=c.getDeclaredConstructors();
    13. for (Constructor constructor : arr2) {
    14. System.out.println("构造器名称:"+constructor.getName()+"构造器参数个数:"+constructor.getParameterCount());
    15. }
    16. System.out.println("----------");
    17. //拿单个构造器,public修饰的
    18. Constructor constructor1=c.getConstructor(null);
    19. System.out.println("构造器名称:"+constructor1.getName()+"构造器参数个数:"+constructor1.getParameterCount());
    20. System.out.println("----------");
    21. //拿单个构造器,有就可以拿
    22. Constructor constructor2=c.getDeclaredConstructor(String.class,int.class);
    23. System.out.println("构造器名称:"+constructor2.getName()+"构造器参数个数:"+constructor2.getParameterCount());
    24. System.out.println("----------");
    25. }
    26. }

    Constructor类用于创建对象的方法

    T newinstance(Object initargs) 根据指定构造器创建对象

    public void setAccessible(boolean flag) 设置true,表示取消访问检查,使用暴力反射(会破坏封装性)

    1. import java.lang.reflect.Constructor;
    2. import reflect.Student;
    3. public class Test2 {
    4. public static void main(String[] args) throws Exception {
    5. Class c=Teacher.class;//获取对象类
    6. Constructor constructor=c.getDeclaredConstructor(null); //获取老师类的私有构造器
    7. //私有构造器是不能访问的,但反射可以通过暴力反射
    8. constructor.setAccessible(true);//开启暴力反射(会破坏封装性)
    9. Teacher t=(Teacher)constructor.newInstance();
    10. System.out.println(t); //打印的是默认值
    11. }
    12. }

  • 相关阅读:
    7.0 异常处理
    虚拟列表方案实现
    列表和字典练习
    什么是 Web 3.0?(新手入门指南)
    Open3D读取文件
    MindSpore端侧手机应用实战:AI垃圾分类应用
    zero_damaged_pages 隐含参数,处理磁盘页损坏(先占位)
    freeCodeCamp响应式网页设计笔记
    珂朵莉树维护并查集:CF1725K
    ArcGIS生态服务敏感性网格化计算并空间可视化(附练习数据下载)
  • 原文地址:https://blog.csdn.net/m0_64365315/article/details/125994702