• Java反射机制


    1.反射机制获取类的三种方法

    //第一种方式:  
    Classc1 = Class.forName("Employee");  
    //第二种方式:  
    //java中每个类型都有class 属性.  
    Classc2 = Employee.class;  
    //第三种方式:  
    //java语言中任何一个java对象都有getClass 方法  
    Employee e = new Employee();  
    Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)
    

    2.利用反射机制创建对象

    Class<?> forName = Class.forName("com.jarye.entity.User");
    // 实例化无参构造函数
    Object newInstance = forName.newInstance();
    // 实例化有参构造函数
    Class<?> forName = Class.forName("com.jarye.entity.User");
    Constructor<?> constructor = forName.getConstructor(String.class, String.class);
    User newInstance = (User) constructor.newInstance("123", "123");
    

    3.反射常用方法

    方法名称 作用
    getDeclaredMethods[] 获取该类的所有方法
    getReturnType() 获取该类的返回值
    getParameterTypes() 获取传入参数
    getDeclaredFields() 获取该类的所有字段
    setAccessible 允许访问私有成员

    4.反射底层原理

    底层原理

    反射机制底层其实走的是MethodAccessor,分为2步:
    a、访问控制检查(判断该方法的修饰符modifiers是否为public)
    b、调用MethodAccessor.invoke()实现方法执行,创建MethodAccessor有两种选择

    • sun.reflect.noInflation的设置为true,则ReflectionFactory利用MethodAccessor的字节码生成类MethodAccessorGenerator直接创建一个代理类,通过间接调用原方法完成invoke()任务【使用Java代码生成】
    • sun.reflect.noInflation的设置为false或未达到设置值(默认15次)时,创建DelegatingMethodAccessorImpl委托类,并将执行invoke()方法的具体内容交由NativeMethodAccessorImpl实现【使用Native代码生成】
    参数 说明
    sun.reflect.noInflation 是控制是否立即进行类膨胀
    sun.reflect.inflationThreshol 类膨胀阈值
    可以通过启动参数-Dsun.reflect.noInflation=false -Dsun.reflect.inflationThreshold=15
    
  • 相关阅读:
    POJ 3468 A Simple Problem with Integers(线段树区间求和)
    windows+Ubuntu双系统 windows引导修复
    CSDN博文大赛火爆开启
    TNS-12541,TNS-12560,TNS-00511,TNS-12542,TNS-12560,TNS-00512数据库启动监听报错
    MResource
    【LeetCode】【Python】Linked List Cycle
    中间件解析FDMEMTABLE.delta生成SQL的方法
    TDSTCPServerTransport 的Filters
    DATASNAP压缩过滤器的使用
    咏南CS插件开发框架也可BS方式部署
  • 原文地址:https://www.cnblogs.com/jarye/p/13951407.html
Copyright © 2020-2023  润新知