zoukankan      html  css  js  c++  java
  • java基础知识---反射与new的概念

    概述:之前在学习spring框架时,重点了解了一些依赖注入(即:控制反转),这里最核心的概念就是反射的机制,那么我今天将冲3个方面了梳理一下new和反射的概念

    1、new只有在知道类名之后才能new,而反射有时候不需要

       反射实例对象的方式

        -->知道类名的情况:

          Class<?> c1 = Class.forName("cn.classes.OneClass");
          Class<?> c2 = new OneClass.getClass();
          Class<?> c3 = OneClass.class();

       -->不知道类名的情况:通过动态代理实现的

    首先jvm在其内部通过函数ProxyGenerator.generateProxyClass()方法来生成代理对象的字节码文件(其实就没有具
    体文件,一切都是在内存中,暂时就这么叫吧),然后defineClass0()函数利用之前生成的二进制字节码文件来创建
    类Class对象,并顺便为代理类命名(proxyName是在字节码文件生成之前自己命名的),经过这个过程我们就可以在不
    知道类名的情况下得到了类Class对象了,然后就可以使用反射来获取对象实例了(这其中牵扯到类加载的加载过程,
    具体内容请详看有关资料)

    2、new出来的对象中,我们是无法反问她的私有属性,而反射可以(通过setAccessible()取访问)

    3、new属于静态编译,而反射属于动态编译,静态编译就是在编译的时候把你所有的模块都编译进exe里去,当你启动这个exe的时候所有模块都加载进来了。你写小程序没问题,但程序一大,加载的过程(就是当你运行程序时初始化的过程)就比较费力了。。大多数ppc的硬件配置还是很一般的。动态编译就不一样了,你编译的时候那些模块都没有编译进去,一般情况下你可以把那些模块都编译成dll,这样你启动程序(初始化)的时候这些模块不会被加载,而是在运行的时候,用到那个模块就调用哪个模块。

  • 相关阅读:
    Pivot Table 实现详解(一)
    VSTS 离线源码版本辅助工具
    早上发现还是问题不断
    VSTS 离线源码版本辅助工具源码
    C#单元测试
    长沙招聘若干 ASP.NET 开发人员(长期有效)
    解析判定数据有效性表达式的存储过程 for SQLServer
    提高 SNAP 网页预览图的采集速度
    用了2年多快3年的老ASUS本子出了点小问题了
    模拟一下细胞的繁殖(CSDN号召帖)
  • 原文地址:https://www.cnblogs.com/jiazhutao/p/12447385.html
Copyright © 2011-2022 走看看