• java反射


    java反射

    获取Class对象的方式

    • Class.forName("全类名"): 将字节码文件加载进内存,返回class对象
      • 多用于配置文件,将类名定义在配置文件中,读取文件加载类
    • 类名.class:通过类名的class属性来获取
      • 多用于参数的传递
    • 对象.getClass(): 通过对象的getClass方法来获取
      • 多用于对象的获取字节码方式

        package reflect;

        public class Reflect {

        //    获取class的三种方式
        public static void main(String[] args) throws ClassNotFoundException {
        
            //1.Class.forName("全类名"): 将字节码文件加载进内存,返回class对象
            Class cls1 = Class.forName("reflect.Person");
            System.out.println(cls1);
        
            //2类名.class:通过类名的class属性来获取
            Class cls2 = Person.class;
            System.out.println(cls2);
        
            //3.对象.getClass():  通过对象的getClass方法来获取
            Person person = new Person();
            Class cls3 = person.getClass();
            System.out.println(cls3);
        
            // 比较三个对象
            System.out.println(cls1 == cls2); //true
            System.out.println(cls1 == cls3); //true
        }
        

        }

    同一个字节码文件(*.class)在程序运行过程中,只会被加载一次,不论通过哪一种方式获取的class对象都是同一个

    使用class对象

    • 获取功能
      • 获取成员变量
        • Field[] getFields()
          • 获取所有public修饰的成员变量
        • Field getField(String name)
        • Field[] getDeclaredFields()
        • Field getDeclaredField(String name)
      • 获取构造方法们
        • Constructor<?>[] getConstructors()
        • Constructor getConstructor(类<?>... parameterTypes)
        • Constructor<?>[] getDeclaredConstructors()
        • Constructor getDeclaredConstructor(类<?>... parameterTypes)
      • 获取成员方法们
        • Method[] getMethods()
        • Method getMethod(String name, 类<?>... parameterTypes)
        • Method[] getDeclaredMethods()
        • Method getDeclaredMethod(String name, 类<?>... parameterTypes)
      • 获取类其他属性
        • 获取类名
          • String Name getName()
      • Field: 成员变量
        • 操作:
          • 设置值:
            • void set(Object obj, Object value);
          • 设置值:
            • get(Object obj)
          • 暴力反射
            • setAccessible(true)
      • Constructor:
        • 创建对象:
          • newInstance: 创建对象
      • Method
        • 执行方法:
          • invoke(Object obj, Object... args)
        • 获取方法的名称
          • getName
    • package reflect;
      
      
      import java.lang.reflect.Constructor;
      import java.lang.reflect.Field;
      import java.lang.reflect.Method;
      
      public class Reflect {
      
          //    获取class的三种方式
          public static void main(String[] args) throws Exception {
      
              Class<?> cls1 = Class.forName("reflect.Person");
              //        - 获取成员变量
              //                - Field[]    getFields()
              Field[] fields = cls1.getFields();
      
              for (Field field : fields) {
                  System.out.println(field);
              }
      
      
              Field sex = cls1.getField("sex");
      
      
              Person person = new Person();
      
              // 获取值
              Object value = sex.get(person);
              System.out.println(value);
      
              // 设置值
              sex.set(person, "男");
              System.out.println(person.sex);
      
      
              // 获取所有的成员变量,不考虑成员修饰符
              Field[] declaredFields = cls1.getDeclaredFields();
              for (Field declaredField : declaredFields) {
                  System.out.println(declaredField);
              }
      
      
              Field name = cls1.getDeclaredField("name");
              // 忽略访问权限修饰符的安全检查--> 暴力反射
              name.setAccessible(true);
              Object o = name.get(person);
              System.out.println(o);
      
      
              // 获取构造方法
              Constructor<?> constructor = cls1.getConstructor(String.class, int.class);
              System.out.println(constructor);
      
      
              // 创建对象
              Object ivy = constructor.newInstance("IVY", 23);
              System.out.println(ivy);
      
      
              // 获取成员方法们
              Method[] methods = cls1.getMethods();
              for (Method method : methods) {
                  System.out.println(method);
              }
      
              // 获取指定的方法
      
              // 空参方法获取
              Method eat = cls1.getMethod("eat");
              eat.invoke(person);
      
              // 有参方法获取
              Method say = cls1.getMethod("say", String.class);
              say.invoke(person, "123");
      
      
              // 获取类名
              String name1 = cls1.getName();
              System.out.println(name1);
      
      
          }
      }
  • 相关阅读:
    React 组件生命周期
    React Ant Design Mobile 中 ListView 简单使用,搞懂每一行代码
    .net网站自动化部署-致两年前的遗留的问题
    【479】cross-entropy与softmax的求导
    【478】Victor Zhou深度学习链接
    网站高并发大流量访问的处理及解决方案
    年轻人的第一个 Docker 应用,大大提高生产力!
    Spring Boot 静态资源处理,妙!
    Spring 配置最好不要配置 xsd 版本号!
    自己动手实现一个简单的 IOC,牛皮!!
  • 原文地址:https://www.cnblogs.com/ivy-blogs/p/13607751.html
Copyright © 2020-2023  润新知