• Java反射机制2


      想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中

      的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节

      码文件也就对应着一个Class类型的对象,也就是字节码文件对象。

      获取字节码文件对象的三种方式。

     - Class clazz1 = Class.forName("全限定类名"); 

     通过Class类中的静态方法forName,直接获取到一个类的字节码文件对象,此时该类还是源文件阶段,并没有变为字节码文件

      - Class clazz2  = Person.class;  

      当类被加载成.class文件时,此时Person类变成了.class,在获取该字节码文件对象,也就是获取自己, 该类处于字节码阶段

      - Class clazz3 = p.getClass();  

      通过类的实例获取该类的字节码文件对象,该类处于创建对象阶段 

    Class.forName和x.class获取类对象的区别  

    处理静态代码块和静态属性

    Class clz = Class.forName("com.yan6.class2.A1");

    System.out.println(clz);

    不会处理静态代码块和静态属性

    Class clz2=A1.class;

    System.out.println(clz2);

    ## 获取类的Class对象

    Class 类的实例表示正在运行的 Java 应用程序中的类和接口。获取类的Class对象有4种方式

     方法                                                 

    编程调用方法

     调用getClass                                                 

     `Boolean var1 = true;Class classType2 = var1.getClass();System.out.println(classType2); ` 输出:class java.lang.Boolea

     运用.class 语法                                              

     `Class classType4 = Boolean.class;
    System.out.println(classType4);`输出:class java.lang.Boolean

     运用静态方法Class.forName()                                  

     `Class classType5 =   Class.forName("java.lang.Boolean"); System.out.println(classType5);` 输出:class java.lang.Boolean

     运用primitive wrapper classes的TYPE语法,这里返回的是原生类型,和Boolean.class返回的不同

     `Class classType3 = Boolean.TYPE; System.out.println(classType3);`输出:boolean

    ### 创建实例

     通过反射来生成对象  [面试]

    1、使用Class对象的newInstance()方法来创建Class对象对应类的实例

    java

    Class c = String.class;

    Object str = c.newInstance();

    2、先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建对象,这种方法可以用指定的构造器构造类的实例

    获取String的Class对象

    Class str = String.class;

    通过Class对象获取指定的Constructor构造器对象

    Constructor constructor=c.getConstructor(String.class);

    根据构造器创建实例:

    Object obj = constructor.newInstance(“hello reflection”);

    获取类对象的方法  [面试]

     获取类类对象的四种方式

    public class TestOne {

        public static void main(String[] args) {

             一、使用类名获取该类的 Class 对象(常用)

            Class classOne = Student.class;

             二、使用对象获取该对象的类的 Class 对象(常用)

            Student stu = new Student();

            Class classTwo = stu.getClass();

             三、使用完整类名字符串获取该类的 Class 对象

             p.s. 这种方式可以在类还没有加载时获得

            try {

                Class classThree = Class.forName("com.yan.Student");

            } catch (ClassNotFoundException e) {

                e.printStackTrace();

            }

             四、使用类加载器获取 Class 对象(矛盾的操作)

            ClassLoader classLoader = Student.class.getClassLoader();

            try {

                Class classFour = classLoader.loadClass("com.yan.Student");

            } catch (ClassNotFoundException e) {

                e.printStackTrace();

            }

        }

    }

      ## 获取构造方法

    通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例。`Class`类提供了几个方法获取类的构造器。

    方法                                                         

     说明

     `Constructor getConstructor(Class...   parameterTypes)`

     返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法

     `Constructor[] getConstructors()`                         

     返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法

     `Constructor getDeclaredConstructor(Class...   parameterTypes)`

     返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法

     `Constructor[] getDeclaredConstructors()`                 

     返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。它们是公共、保护、默认(包)访问和私有构造方法

      ## 获取类属性

    获取类的Fields。可以通过反射机制得到某个类的某个属性,然后改变对应于这个类的某个实例的该属性值。JAVA 的`Class`类提供了几个方法获取类的属性。

    方法                                                        

     说明

     Field getField(String name)         

     返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段

     Field[] getFields()                 

     返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段

     Field getDeclaredField(String name)

     返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段

     Field[] getDeclaredFields()         

     返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段

    可见getFields和getDeclaredFields区别:

    - getFields返回的是申明为public的属性,包括父类中定义,

    - getDeclaredFields返回的是指定类定义的所有定义的属性,不包括父类的。

      ## 获取类中的方法

    通过反射机制得到某个类的某个方法,然后调用对应于这个类的某个实例的该方法。Class类提供了几个方法获取类的方法。

     方法                                                        

     说明

    Method getMethod(String name, Class...   parameterTypes)

     返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法

     Method[] getMethods()                                        

     返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法

    Method getDeclaredMethod(Stringname, Class...   parameterTypes)

     返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法

     Method[] getDeclaredMethods()                                

     返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法

  • 相关阅读:
    AI+低代码:开启普惠人工智能时代的新篇章
    NOIP2023模拟9联测30 D. 金牌
    流媒体技术基础-流媒体编码与协议
    pdf编辑软件哪个好用?5款PDF编辑器分享
    05【NIO核心组件之Channel】
    Python生成器
    @Excel注解
    精品基于NET实现的数码新闻发布系统
    Cloak斗篷、AB轮询收款科技详解,FP独立站原来可以这样玩!
    spring框架技术学习
  • 原文地址:https://blog.csdn.net/zjh0101/article/details/126942092