java的反射

1. 获取class对象的三种方式

  • Class.forName();
  • 类名.class
  • 实例对象.getClass();

2. 利用反射获取构造函数

  • Constructor<?>[] getConstructor() 返回所有公共构造方法对象数组

  • Constructor<?>[] getDeclaredConstructors() 返回所有构造方法对象数组(包括私有)

  • Constructor<?> getConstructor(...数据类型.class) 返回单个公共构造方法对象

  • Constructor<?> getDeclaredConstructor(...数据类型.class) 返回单个构造方法对象(包括私有)

    (1) Constructor类中用于创建对象的方法

    • T newInstance() 根据指定的构造方法创建对象
    • setAccessible(boolean flag) 设置为true,表示取消访问(私有构造方法)检查
 @Test
 public void f2() throws Exception {
        //通过类名.class加载字节码文件
        Class<User> userClass = User.class;
        //获取private修饰的构造方法
        Constructor<User> contructor = userClass.getDeclaredConstructor(String.class, String.class);
        //设置取消权限检查
        contructor.setAccessible(true);
        //使用该构造方法
        User s = contructor.newInstance("张三","123");
        System.out.println(s);
  }

3. Class类中用于获取成员变量的方法

  1. Field[] getField() 返回所有公共成员变量对象的数组

  2. Field[] getDeclaredFields() 返回所有成员变量对象的数组(包括私有)

  3. Field getField(String name) 返回单个公共成员变量对象

  4. Fidld getDeclaredField(String name) 返回单个成员变量对象

    (1)Field类中用于创建对象的方法

    ​ --void set(Object obj,Object value) 赋值

    ​ --Object get(Object obj) 获取值

@Test
public void f3() throws Exception{
        Class<User> userClass = User.class;
        //获取私有的属性
        Field name = userClass.getDeclaredField("name");
        name.setAccessible(true);
        //获取属性名
        String str = name.getName();
        System.out.println(str);
        //获取访问修饰符
        int modifiers = name.getModifiers();
        System.out.println(modifiers);
        //获取对象的值
        User user = new User(1,"张三","123456");
        String o = (String)name.get(user);
        System.out.println(o);
        //设置对象的值
        name.set(user,"李四");
        System.out.println(user);
    }

4.利用反射获取成员方法

  1. Method[] getMethods() 返回所有公共成员方法对象的数组(包括继承的)

  2. Method[] getDeclaredMethods() 返回所有成员方法对象的数组,不包括继承

  3. Method getMethod(String name, ...paramterTypes) 返回单个公共成员方法对象

  4. Method getDeclaredMethod(String name, ...paramterTypes) 返回单个成员方法对象

    (1) Method类中用于创建对象的方法

    ​ --Object invoke(Object obj, Object...args) 运行方法

    ​ 参数一:用obj对象调用该方法

    ​ 参数二:调用方法的传递的参数(没有就不写)

    ​ 返回值:方法的返回值(没有不写)

@Test
public void f4()throws Exception{
        Class<User> userClass = User.class;
        Method abc = userClass.getDeclaredMethod("abc",String.class);
        abc.setAccessible(true);
        String str = (String) abc.invoke(userClass,"李四");
        System.out.println(str);
    }

5.反射的作用

  1. 获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑
  2. 结合配置文件,动态的创建对象并调用方法。
 @Test
 public void f5()throws Exception{
        //对于任意一个对象,都可以把对象所有的字段名和值,保存到文件中去。
        Class<User> userClass = User.class;
        User u = new User(1,"张三","123456");
        Field[] declaredFields = userClass.getDeclaredFields();
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("aaa.txt",true));
        for (Field field:declaredFields) {
            field.setAccessible(true);
            String name = field.getName();
            String value = field.get(u)+"";
            String str = name+"="+value+"\n";
            bos.write(str.getBytes());
        }
        bos.flush();
        bos.close();
    }
posted @ 2023-03-07 07:55  彼时听风  阅读(70)  评论(0)    收藏  举报