reflect

1、获取class对象的三种方法:再java文件加载的时候,首先通过.java文件通过编译生成.class文件。类加载器会把.class文件加载到内存中。那么在内存中会存在一个(产生Class对象,一个类 只会产生一个Class对象)。我们通过反射就是操作的该对象。

//1、通过class.forname()来获取Class对象
      Class clazz = Class.forName("com.mashibing.entity.Emp");
//2、通过类名.class来获取
        Class<Emp> clazz = Emp.class;
 //3、通过对象的getClass()来获取
  Class clazz = new Emp().getClass();
 //4、如果是一个基本数据类型,那么可以通过Type的方式来获取Class对象
    Class type = Integer.TYPE;

2、反射可以获取变量,构造方法,方法。不论时私有的还有共有的都可以获取。

 Class<?> clazz = Class.forName("com.mashibing.reflect.Student");
        //获取成员变量,包括子类及父类,同时只能包含公共的方法
        Field[] fields = clazz.getFields();
        for (Field field : fields) {
            System.out.println(field);
            System.out.println(field.getName());
            System.out.println(field.getType());
            System.out.println(field.getModifiers());
            System.out.println("-----");
        }
        System.out.println("=======================");
        //此方法返回的是当前类的所有属性,不仅仅局限于公共访问修饰符,所有的访问修饰符都可以拿到
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField.getName());
        }
        System.out.println("========================");
        //反射在一定程度上破坏了封装性,需要合理使用
        Field address = clazz.getDeclaredField("address");
        //设置该属性是否能被访问,true表示能被访问,破坏了封装性
        address.setAccessible(true);
        System.out.println(address.getName());
        Object o = clazz.newInstance();
        address.set(o,"北京市");
        System.out.println(((Student)o).getAddress());
        System.out.println("===============================");
        //获取该对象的普通方法,包含的方法范围是当前对象及父类对象的所有公共方法
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            System.out.println(method.getName());
        }
        System.out.println("-----------------------");
        //获取当前类中所有的方法,无论什么访问修饰符
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod.getName());
        }
        System.out.println("--------------");
        Method add = clazz.getDeclaredMethod("add", int.class, int.class);
        add.setAccessible(true);
        Object o1 = clazz.newInstance();
        add.invoke(o1,123,123);

        System.out.println("----------------------");
        //获取对象的所有构造方法,只能获取公有的改造方法
        Constructor<?>[] constructors = clazz.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor.getName());
        }
        System.out.println("--------------");
        //获取所有的构造方法,无论是私有还是公有
        Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor.getName());
        }
        //如何调用私有的构造方法呢?
        Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(String.class, int.class, String.class);
        declaredConstructor.setAccessible(true);
        Student o2 = (Student)declaredConstructor.newInstance("msb", 23, "java");
        System.out.println(o2);

 

posted @ 2022-05-01 18:22  Jerry&Ming  阅读(32)  评论(0)    收藏  举报