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);
    
    
        }
    }
原文地址:https://www.cnblogs.com/ivy-blogs/p/13607751.html