信息发布→ 登录 注册 退出

Java的反射机制一起来看看

发布时间:2026-01-11

点击量:
目录
  • 一、什么是反射机制?
    • 获得Class类对象的三种方式:
  • 二、Class类
    • 三、Package类
      • 四、Field类
        • 五、Method类
          • 六、Constructor类
            • 总结

              一、什么是反射机制?

              反射就是运行时识别类的能力,在运行时可以获得当前对象的类结构,动态创建类的实例,调用对象的方法等;

              获得Class类对象的三种方式:

              方式一 :Class.forName(“类名”);

              Class类的一个静态方法forName 加载类获得类对象 运行的类库中没有Person类,程序依然可以编译。

              Class cls = Class.forName("com.oracle.vo.Person");

              方式二: 类名.class

              要求运行的类库一定要有Person类

              //编译的字节码文件中,会为每个类 定义一个静态的属性class 类型是Class类型
              //会为每个类定义一个属性,存储自己类的类对象
              Class cls = Person.class;

              方式三: 对象.getClass()

              要求运行的类库中一定要有Person类 当持有了一个对象时,可以根据对象获得其类对象

              Person p = new Person();
              //getClass方法是Object类的方法,所有的对象都有getClass方法
              Class cls = p.getClass();

              二、Class类

              API方法

              1. getName() 获得类对象对应类的类名(全类名:包名+类名)

              2. getSimpleName() 获得类对象对应类的类名

              3. getPackage() 获得类对象对应类的包对象

              try {
                  Class cls = Class.forName("com.oracle.vo.Person");
                  System.out.println(cls.getName());
                  System.out.println(cls.getSimpleName());
                  Package page = cls.getPackage();
                  System.out.println(page.getName());
                  } catch (ClassNotFoundException e) {
               
                  e.printStackTrace();
              }

              4. getField(String name) 根据名字获得能访问的属性。

              5. getDeclaredField(String name) 根据名字获得属性。

              6. getDeclaredFields() 获得所有的属性

              7. getDeclaredMethod()

              8. getDeclaredConstructor(Class... types) 根据参数列表获得构造器

              9. newInstance() 通过无参构造器创建对象

              10. getSuperClass() 获得父类的类对象

              三、Package类

              Package对象抽象为包

              四、Field类

              是属性的抽象,Field类的实例就是某个属性,Field类包括了属性名、属性类型、属性值、修饰范围等。

              获得属性对象,主要的作用是对属性进行赋值或取值的操作。

              1. get(Object obj) 返回Object :获得某个对象的属性值。

              2. setAccessible(boolean flag) : 设置属性是否可访问。

              3. set(Object obj,Object value) : 设置属性值

                  public static void main(String[] args) {
                      //获得Person的类对象 ,获得Person的Class对象
                      Person p = new Person();
                      p.setName("tom");
                      try {
                          Class cls = Class.forName("com.oracle.vo.Person");
                          //获得Person类中所有的属性
                          Field[] fields = cls.getFields();
                          //获得Person类中的name属性
                          Field field = cls.getDeclaredField("name");
                          System.out.println(field.getName());
                          //获得 某个Person对象 的name属性值
                          //field: Person类的name属性
                          //设置这个属性可访问,忽略修饰范围
                          field.setAccessible(true);
                          //设置p对象的name属性值 为jack
                          field.set(p, "jack");
                          System.out.println(field.get(p));
                      } catch (ClassNotFoundException e) {
                          e.printStackTrace();
                      } catch (NoSuchFieldException e) {
                          e.printStackTrace();
                      } catch (SecurityException e) {
                          e.printStackTrace();
                      } catch (IllegalArgumentException e) {
                          e.printStackTrace();
                      } catch (IllegalAccessException e) {
                          e.printStackTrace();
                      }
                  }

              五、Method类

              invoke(Object obj, Object ... args) 返回Object : 执行method方法

                  public static void main(String[] args) {
                      //获得Person的类对象 ,获得Person的Class对象
                      Person p = new Person();
                      p.setName("tom");
                      try {
                          Class cls = Class.forName("com.oracle.vo.Person");
                          //获得Person类的 method(String name) 方法对象
                          Method method1 = cls.getDeclaredMethod("method", String.class);
                          //获得Person类的 method() 方法对象
                          Method method2 = cls.getDeclaredMethod("method");
                          //method(int i,String name) 方法对象
                          Method method3 = cls.getDeclaredMethod("method",int.class,String.class);
                          //获得全部方法
                          Method[] methods = cls.getDeclaredMethods();
                          //获得方法要作什么? 就是要调用方法
                          //obj参数: 调用哪个对象的方法
                          method1.invoke(p, "abc");
                          System.out.println(method3.invoke(p, 10,"abcd"));
                      } catch (ClassNotFoundException e) {
                          e.printStackTrace();
                      } catch (SecurityException e) {
                          e.printStackTrace();
                      } catch (IllegalArgumentException e) {
                          e.printStackTrace();
                      } catch (NoSuchMethodException e) {
                          e.printStackTrace();
                      } catch (IllegalAccessException e) {
                          e.printStackTrace();
                      } catch (InvocationTargetException e) {
                          e.printStackTrace();
                      }
                  }

              六、Constructor类

              newInstance(Object ... args) 调用构造器创建对象

                  public static void main(String[] args) {
                      //获得Person的类对象 ,获得Person的Class对象
                      Person p = new Person();
                      p.setName("tom");
                      try {
                          Class cls = Class.forName("com.oracle.vo.Person");
                          //获得 public Person() 构造器
                          Constructor constructor1 = cls.getDeclaredConstructor();
                          //public Person(String name, int age) 构造器
                          Constructor constructor2 = cls.getDeclaredConstructor(String.class,int.class);
                          //获得构造器的作用,要调用构造器创建对象
                          Object obj1 = constructor1.newInstance();
                          Object obj2 = constructor2.newInstance("tom",20);
                      } catch (ClassNotFoundException e) {
                          e.printStackTrace();
                      } catch (SecurityException e) {
                          e.printStackTrace();
                      } catch (IllegalArgumentException e) {
                          e.printStackTrace();
                      } catch (NoSuchMethodException e) {
                          e.printStackTrace();
                      } catch (InstantiationException e) {
                          e.printStackTrace();
                      } catch (IllegalAccessException e) {
                          e.printStackTrace();
                      } catch (InvocationTargetException e) {
                          e.printStackTrace();
                      }
                  }

              总结

              本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容! 

              在线客服
              服务热线

              服务热线

              4008888355

              微信咨询
              二维码
              返回顶部
              ×二维码

              截屏,微信识别二维码

              打开微信

              微信号已复制,请打开微信添加咨询详情!