• Java反射


    反射 reflect

      Java通过反射来获得“动态性(程序运行期间改变程序结构)”,在执行期间,才动态获得类的内部信息、并直接操作内部属性和方法。

      不需要事先(写代码/编译期)知道运行对象是谁。我的感觉是可以根据外部的输入,来动态获取不同对象的类的信息。

     


    反射实例:


     创建实体类Entity(pojo):

    写完变量后:

      1)创建构造函数

      右击,选择Generate(或者Alt+INS)

      

      

       2) get & set 获取私有属性;toString方便调试

      


     写main方法:

      psvm然后Tab:

      sout:


     Class加载内存分析  https://www.bilibili.com/video/BV1p4411P7V3?p=9 (建议多看几遍)

      字节码加载到内存=》链接合并到jvm环境,设置static默认初始值 =》类构造器clinit初始化

      


     常量和static变量在链接时就已经赋值了,初始化之前就已经存在了,引用这些量不会导致初始化。


    ClassLoader  类加载器

    类加载器细分:

      1. bootStrap - 根  类加载器(jre/ lib/ rt.jar)

      2. ext - 扩展加载器 (jre/ lib/ ext/ ...)

      3. app - 应用程序(系统类) 加载器,最常用


     双亲委派机制

     选择类加载器的顺序:

      bootStrap->ext->app->custom。先找boot,再找ext、app,最后找costom也就是自己写的。都找不到就报错Class Not Found

    好处:

      防止用户乱定义类:比如自定义一个String类,这时会先从BootStrap找,所以不会轮到自定义的String类


      Class c1 = user.getClass()

      c1.getFields()    getDeclaredFields()    getField("Fieldname",String.class)按要求获取

      c1.getMethods()   getDeclaredMethods()   getMethod("Methodname",String.class)

      c1.getConstructors()   getDeclearedConstructors()

     1)由知道的c1这个Object,获取c1的Class的信息(属性

      

      

    2)由知道的c1这个Object,获取c1的Class的信息(方法

      

       

      

        

    3)由知道的c1这个Object,获取c1的Class的信息(构造器

      


    反射实例

     

      本例反射方式中,将getName方法剥离出来,再使用invoke来调用user对象(getName也可用于调用其他对象)

     最后看下耗时:

       反射很慢,但有时候还是需要的


     通过反射获取泛型  https://www.bilibili.com/video/BV1p4411P7V3?p=15  

    method.getGenericParameterTypes()       method.getGenericReturnType()       


  • 相关阅读:
    idea自带的maven
    面试题汇总
    mybatis参数处理
    tips
    mybatis-config.xml
    helloWorld程序
    idea遇到的问题汇总
    PL/SQL批量执行SQL脚本文件
    Iframe跳转本地项目
    angular video播放问题
  • 原文地址:https://www.cnblogs.com/qyf2199/p/14063008.html
Copyright © 2020-2023  润新知