• 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);
  • 相关阅读:
    WCF系列(一)BasicHttpBinding 和 WsHttpBinding 的不同点
    SQL Server中的事务与锁
    领域驱动设计之领域模型
    http请求到响应经历的阶段
    vs调试
    c# 基本值类型及其默认值
    ASP.NET中JSONP的两种实现以及其他跨域解决方案的简单实现
    通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?
    最完整的数据倾斜解决方案(spark)
    Spark性能调优
  • 原文地址:https://www.cnblogs.com/DDiamondd/p/10685284.html
Copyright © 2020-2023  润新知