• Java 反射


    反射机制:在程序运行状态中,动态的获取对象的信息和调用对象的方法

    反射的功能:

    • 在运行时判断任意一个对象所属的类
    • 在运行时构造任意一个类的实例
    • 在运行时判断任意一个类所具有的成员变量和方法
    • 在运行时调用任意一个对象的方法
    • 生成动态代理

    获取反射的三种方式:

    1. Class.forName(全类名(包名+类名))
    2. 类名.class
    3. 对象.getClass()
         Class<?> clazz = Class.forName("com.bean.Student");
            clazz.getMethods(); //获取所有的公共的方法
            clazz.getInterfaces(); //获取所有的接口
            clazz.getSuperclass();//获取所有的父类
            clazz.getConstructors();//获取所有的构造函数
            //如果要获取私有的 :  加上Declared
            clazz.getDeclaredMethods();//获取所有的方法 包括私有方法
            
            //通过Class对象获取实例
            Student s = (Student) clazz.newInstance();
            //获取具体属性
            Field nameField = clazz.getField("name");
            //操作属性
            nameField.set(s, "zxf"); //就相当于 s.setName("zxf");
            /*
             * 如果操作的是私有属性  需要暂时打开访问权限
             * nameField.setAccessible(true);  再进行操作  -->对于方法和构造函数也是一样
             */
            //获取具体方法
            Method method1 = clazz.getMethod("showInformation", null); //第二个参数是该方法的参数类型
            method1.invoke(s, null);  //执行方法
            
            //获取具体构造函数
            Constructor constructor = clazz.getConstructor(null);  //获取无参构造函数
            Student s1 = (Student) constructor.newInstance(null);   //通过构造方法获取实例

    反射可以越过泛型检查:

         List<Integer> list = new ArrayList<Integer>();
            list.add(12);
            list.add(34);
            Class listClass = list.getClass();
            Method addMethod = listClass.getMethod("add", Object.class);  ///第二个参数是:所获取的方法的参数类型
            addMethod.invoke(list, "1234");
            System.out.println(list);
  • 相关阅读:
    JOptionPane&&Exception的使用
    CppUnit在VS2010上的正确使用
    怎样认识比你优秀的人并和他们成为朋友呢?
    二十岁出头的时候上,你一无所有,你拥有一切。
    C语言实现文件复制
    关于二维数组可以开多大
    exit(0)与exit(1)、return区别
    学语言究竟学什么?
    当oracle出现 格式与字符串格式不匹配解决办法
    javascript的系统函数
  • 原文地址:https://www.cnblogs.com/DDiamondd/p/10685284.html
Copyright © 2020-2023  润新知