精华内容
下载资源
问答
  • JAVA底层

    千次阅读 2019-12-17 10:05:51
    谈谈你对java的理解 1:平台无关性 2: GC 3:语言特性 4:面向对象,封装继承多肽 5:类库 网络库 io nio 之类的 6:异常处理 1:平台无关性 java 分为编译时,运行时 java 源码会编译为字节码,再有不同...

    谈谈你对java的理解

    1:平台无关性

    2: GC

    3:语言特性

    4:面向对象,封装继承多肽

    5:类库 网络库 io nio 之类的

    6:异常处理

    1:平台无关性

     java 分为编译时,运行时

    java 源码会编译为字节码,再有不同平台的jvm去解析,java语言在不同平台上运行时不需要进行重新编译,java虚拟机在执行字节码的时候,把字节码转换成具体平台上的机器指令

    jvm如何加载class文件

    jvm 是一个内存中的虚拟机,

    Class Loader :依据特定格式加载class文件到内存

    Execution Engine:对命令进行解析,解析完成之后到操作系统去执行 

    Native Interface :融合不同开发语言、的原生库为java所用

    Runtime Data Area:JVM内存空间结构模型

    java反射

    java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制

    反射例子

    创建test类

     

    package com.test.hq;
    public class Test {
        private String name;
        public void sayHi(String helloSentence) {
            System.out.println("helloSentence"+":"+name);
        }
        private String sayHello(String tag) {
            return "sayHello"+":"+tag;
        }
    }
    public class testStr {
        public static void main(String[] args) throws Exception {
            Class ts= Class.forName("com.test.hq.Test"); 
            Test test = (Test) ts.newInstance();
            Method getm = ts.getDeclaredMethod("sayHello", String.class);//可以获取所有方法包括私有  不能获取继承的方法 
            getm.setAccessible(true);
            Object invoke = getm.invoke(test, "test");
            System.out.println(invoke);
    //        Method method = ts.getMethod("sayHi", String.class);//getMethod能获取到public 及继承的方法,但是不能获取私有的
    //        System.out.println(invoke2);
            Field name = ts.getDeclaredField("name");
            name.setAccessible(true);
            name.set(test, "xiaoming");
            Method method = ts.getMethod("sayHi", String.class);
            Object invoke2 = method.invoke(test, "choose");
            
            }
    }    

    反射就是将java中的各种成分映射为一个个java对象。

    类从编译到执行的过程

    1:编译器将Test.java源文件编译成Test.class字节码文件。

    2:Classloader(类加载器),将字节码文件转换为JVM中的Class<Test>对象。

    3:jvm利用Class<Test>对象实例化为Test对象

    1. 类加载的生命周期:加载(Loading)-->验证(Verification)-->准备(Preparation)-->解析(Resolution)-->初始化(Initialization)-->使用(Using)-->卸载(Unloading)

    什么是Classloader?

    Classloader在java中有着非常重要的作用,它主要工作在Class装载的加载阶段,其主要作用是从系统外部获得Class二进制数据流。它是Java的核心组件,所有的Class都是Classloader进行加载的,Classloader负责通过将Class文件里的二进制数据流装载进系统,然后交给Java虚拟机进行连接、初始化等操作

    Classloader是一个抽象类。

     

    一.概述

     

    定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。类加载和连接的过程都是在运行期间完成的。

     

    二. 类的加载方式

     

    1):本地编译好的class中直接加载

    2):网络加载:java.net.URLClassLoader可以加载url指定的类

    3):从jar、zip等等压缩文件加载类,自动解析jar文件找到class文件去加载util类

    4):从java源代码文件动态编译成为class文件

     

    三.类加载的时机

     

    1. 类加载的生命周期:加载(Loading)-->验证(Verification)-->准备(Preparation)-->解析(Resolution)-->初始化(Initialization)-->使用(Using)-->卸载(Unloading)

     

    2.加载:这有虚拟机自行决定。

    3.初始化阶段:

    a)遇到new、getstatic、putstatic、invokestatic这4个字节码指令时,如果类没有进行过初始化,出发初始化操作。

    b)使用java.lang.reflect包的方法对类进行反射调用时。

    c)当初始化一个类的时候,如果发现其父类还没有执行初始化则进行初始化。

    d)虚拟机启动时用户需要指定一个需要执行的主类,虚拟机首先初始化这个主类。

    注意:接口与类的初始化规则在第三点不同,接口不要气所有的父接口都进行初始化。

     

    四.类加载的过程

     

    4.1.加载

     

    a)加载阶段的工作

    i.通过一个类的全限定名来获取定义此类的二进制字节流。

    ii.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

    iii.在java堆中生成一个代表这个类的java.lang.Class对象,做为方法区这些数据的访问入口。

    b)加载阶段完成之后二进制字节流就按照虚拟机所需的格式存储在方区去中。

     

    4.2.验证

     

    这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求。

    a)文件格式验证:验证字节流是否符合Class文件格式的规范,并且能被当前版本的虚拟机处理。

    b)元数据验证:对字节码描述的信息进行语义分析,以确保其描述的信息符合java语言规范的要求。

    c)字节码验证:这个阶段的主要工作是进行数据流和控制流的分析。任务是确保被验证类的方法在运行时不会做出危害虚拟机安全的行为。

    d)符号引用验证:这一阶段发生在虚拟机将符号引用转换为直接引用的时候(解析阶段),主要是对类自身以外的信息进行匹配性的校验。目的是确保解析动作能够正常执行。

     

    4.3.准备

     

    准备阶段是正式为变量分配内存并设置初始值,这些内存都将在方法区中进行分配,这里的变量仅包括类标量不包括实例变量。

     

    4.4.解析

     

    解析是虚拟机将常量池的符号引用替换为直接引用的过程。

    a)符号引用:符号引用以一组符号来描述所引用的目标,符号可以是任意形式的字面量,只要使用时能无歧义地定位到目标即可。符号引用与虚拟机实现的内存布局无关,引用的目标并不一定已经加载到内存中。

    b)直接引用:直接引用可以是直接指向目标的指针,相对偏移量或是一个能间接定位到目标的句柄。直接饮用是与内存布局相关的。

    c)类或接口的解析

    d)字段的解析

    e)类方法解析

    f)接口方法解析

     

    4.5.初始化

     

    是根据程序员制定的主观计划区初始化变量和其他资源,或者可以从另外一个角度来表达:初始化阶段是执行类构造器<clinit>()方法的过程。

     

    五.JVM三种预定义类型类加载器

     

    当一个 JVM 启动的时候,Java 缺省开始使用如下三种类型类装入器:

     

    启动(Bootstrap)类加载器:引导类装入器是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib 下面的类库加载到内存中。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。

     

    标准扩展(Extension)类加载器:扩展类加载器是由 Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader) 实现的。它负责将

    < Java_Runtime_Home >/lib/ext 或者由系统变量 java.ext.dir 指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。

     

    系统(System)类加载器:系统类加载器是由 Sun 的 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。它负责将系统类路径(CLASSPATH)中指定的类库加载到内存中。开发者可以直接使用系统类加载器。

     

    除了以上列举的三种类加载器,还有一种比较特殊的类型就是线程上下文类加载器,这个将在后面单独介绍。

     

    a. Bootstrap ClassLoader/启动类加载器

    主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作.

     

    b. Extension ClassLoader/扩展类加载器

    主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作

     

    c. System ClassLoader/系统类加载器

    主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作.

     

    d. User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类)

    在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性.

     

    1.1 什么是双亲委派模型

    首先,先要知道什么是类的加载器。简单说,类加载器就是根据指定全限定名称将class文件加载到JVM内存,装维Class对象。如果站在JVM的角度来说,只存在两种加载器:

    • 启动类加载器(Bootstrap ClassLoader):由C++语言实现(针对HotSpot),负责将存放在<JAVA_HOME>\lib目录或-Xbootclasspath参数指定路径中的类库加载到内存中。
    • 其他类型加载器:由Java语言实现,继承自抽象类ClassLoader。如:
      • 扩展类加载器(Extension ClassLoader):负责加载<JAVA_HOME>\lib\ext目录或java.ext.dirs系统便令指定的路径中的所有类库。
      • 应用程序类加载器(Application ClassLoader)。负责加载用户类路径(classpath)上的指定类库,我们可以直接使用这个类加载器。一般情况,如果我们没有自定义类加载器默认就是用这个加载器。

    双亲委派模型工作过程:如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载中这个类,而是把这个请求委派给父类加载器完成。每个类加载器都是如此,只有当父加载器在及其的搜索范围内找不到指定的类时(即ClassNotFoundException),子加载器才会尝试自己去加载。

     

    1.2 为什么需要双亲委派模型?

    为什么需要双亲委派模型呢?假设没有双亲委派模型,试想一个场景:

    黑客自定义一个java.lang.String类,该String类具有系统的String类一样的功能,只是在某个函数稍作修改。比如equals函数,这个函数经常使用,如果在这个函数中,黑客加入一些“病毒代码”。并通过自定义类加载器加入到JVM中。此时,如果没有双亲委派模型,那么JVM就可能误以为黑客自定义的java.lang.String类是系统的String类,导致“病毒代码”被执行。

    而有了双亲委派模型,黑客自定义的java.lang.String永远不会被加载到内存中。因为首先是最顶端的类加载器加载系统的java.lang.String类,最终自定义的类加载器无法加载java.lang.String类。

    或许你会想,我在定义的类加载器里面强制加载自定义的java.lang.String类,不去通过调用父加载器不就好了吗?的确,这样是可行的。但是,在JVM中,判断一个对象是否是某个类型时,如果该对象的实际类型与带比较类型的类加载器不同,那么会返回false。

    举个栗子:

    ClassLoader1、ClassLoader2都加载java.lang.String类,对应Class1,、Class2对象。那么Class1对象不属于ClassLoader2对象加载的java.lang.String类型。

    2. 自定义类加载器

    2.1 几个重要函数

    loadClass默认实现如下:

     

    public Class<?> loadClass(String name) throws ClassNotFoundException {
            return loadClass(name, false);
    }
    

    再看看loadClass(String name, boolean resolve) 函数:

     

    protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }
    
                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);
    
                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }
    

    从上面代码可以明显看出,loadClass(String,boolean)函数即实现了双亲委派模型,整个大致过程如下:

    1. 首先,检查下制定名称的类是否已经加载过,如果加载过了,就不需要再加载,直接返回。
    2. 如果此类没有加载过,那么,再判断下是否有父加载器;如果有父加载器,则由父加载器加载(即调用parent.ladClass(name,false);)或者是调用bootstrap类加载器来加载。
    3. 如果父加载器及bootstrap类加载器都没有找到指定的类,那么调用当前类加载器的findClass方法来完成类加载。

    换句话说,如果自定义类加载器,就必须重写findClass方法!

    find Class

    findClass的默认实现如下

     

    protected Class<?> findClass(String name) throws ClassNotFoundException {
            throw new ClassNotFoundException(name);
    }
    

    可以看出,抽象类ClassLoader的findClass函数默认是抛出异常的。而前面我们知道,loadClass在父加载器无法加载类的时候,就会降低用我们自定义的类加载器中的findClass函数,因此我们必须在loadClass这个函数里面实现将一个指定类名称转换为class对象。

    如果是读取一个指定的名称的类为字节数组的话,这个很好办。但是如何将字节数组转为class对象呢?很简单,Java提供了defineClass方法,通过这个方法,就可以把一个字节数组转为Class对象了。

    defineClass

    defineClass主要的功能是:

    将一个字节数组转为Class对象,这个字节数组是class文件读取后最终的字节数组。如,假设class文件时加密过的,则需要解密后作为形参传入defineClass函数。

    defineClass默认实现如下:

     

    protected final Class<?> defineClass(String name, byte[] b, int off, int len)
            throws ClassFormatError  {
            return defineClass(name, b, off, len, null);
    }
    

    2.2 函数调用过程

     

    image

     

    展开全文
  • Java底层

    2013-11-19 15:44:43
    底层实现 栈内存(StackMemory)由特定应用程序专用, 存储空间是连续的,以栈的方式(后进先出) 进行管理,存储容量小,但访问速度快。 堆内存(HeapMemory)由所有的应用程序公用, 存储空间分配不连续,存储容量大。...

    底层实现

    栈内存(StackMemory)由特定应用程序专用, 存储空间是连续的,以栈的方式(后进先出) 进行管理,存储容量小,但访问速度快。

    堆内存(HeapMemory)由所有的应用程序公用, 存储空间分配不连续,存储容量大。在堆内存中分配存储空间和进行存取操作速度较慢。

    基本类型存放在栈内存;引用类型存放在堆内存。

    局部变量保存在栈内存;成员变量保存在堆内存。


    基础:

    强引用,弱引用,软引用,虚引用:

    http://my.oschina.net/ydsakyclguozi/blog/404389


    JVM内存区域划分:

    http://www.cnblogs.com/dolphin0520/p/3613043.html


    Java启动参数:

    http://blog.csdn.net/turkeyzhou/article/details/7619472


    Memory:

    Java Out of memory 分析:

    http://blog.csdn.net/jinger_z/article/details/5910210

    http://www.iteye.com/topic/1112423


    Java内存溢出分析工具:

    http://blog.csdn.net/michaelfeng726/article/details/8612918


    jmap + MAT 插件 分析内存:

    http://www.cnblogs.com/AloneSword/p/3821569.html


    Thread:

    通过Thread Dump分析性能:

    http://blog.csdn.net/rachel_luo/article/details/8920596




    展开全文
  • java底层原理---ArrayList源码分析

    万次阅读 2020-12-23 11:50:31
    java底层原理—ArrayList源码分析 引言 学习底层是为了更好的选择合适数据结构进行开发,这篇是为了讲解ArrayList底层原理的,同时也是总结一下自己的学习成果。 太多的文字让人看得眼花缭乱,废话不多说,上图解。 ...

    java底层原理—ArrayList源码分析

    引言

    学习底层是为了更好的选择合适数据结构进行开发,这篇是为了讲解ArrayList底层原理的,同时也是总结一下自己的学习成果。

    太多的文字让人看得眼花缭乱,废话不多说,上图解。

    这是ArrayList的属性:

    在这里插入图片描述

    一、创建ArrayList对象,初始化过程

    1. ArrayList<String> list = new ArrayList<>();
      
    2. public ArrayList() {
           //this.当前数组=默认数组
          this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
      }
      
      • 给当前存储数据的数组创建出来,创建完毕。

    二、调用add方法,添加数据过程

    1. list.add("admin");
      
    2. public boolean add(E e) {
          ensureCapacityInternal(size + 1); 
          //add方法把值"admin"传过来就是参数 e ,然后把值放进当前数组的下一个位置,但是我们这个当前数组还并没有被创建,我们就可以看看上面的方法
          elementData[size++] = e;
          return true;
      }
      
    3. 执行ensureCapacityInternal方法

      private void ensureCapacityInternal(int minCapacity) {
          if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
              minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
          }
      
          ensureExplicitCapacity(minCapacity);
      }
      
      • 判断当前数组是否是空的元素数组(一般第一次都是)
      • Math.max()方法是判断两个参数的大小,返回较大的值
      • DEFAULT_CAPACITY是默认容量(10),一般第一次都是会返回默认容量
    4. 执行ensureExplicitCapacity方法

      private void ensureExplicitCapacity(int minCapacity) {
          modCount++;
      
          // overflow-conscious code
          if (minCapacity - elementData.length > 0)
              grow(minCapacity);
      }
      
      • 方法参数是最小容量
      • 如果最小容量(将要开辟的元素空间大小) - 当前数组的长度 > 0 那么就证明空间大小不够,就会执行grow扩容方法
    5. 如果容量不够则执行grow方法

      private void grow(int minCapacity) {
          // overflow-conscious code
          int oldCapacity = elementData.length;
          int newCapacity = oldCapacity + (oldCapacity >> 1);
          if (newCapacity - minCapacity < 0)
              newCapacity = minCapacity;
          if (newCapacity - MAX_ARRAY_SIZE > 0)
              newCapacity = hugeCapacity(minCapacity);
          // minCapacity is usually close to size, so this is a win:
          elementData = Arrays.copyOf(elementData, newCapacity);
      }
      
      • 此方法先是获取到了当前数组的长度大小,然后以 oldCapacity + (oldCapacity >> 1) 的方式每次扩容1.5倍的容量
      • 然后最后将当前数组给copy替换成新容量的数组,至此扩容完毕。

    三、总结

    • ArrayList底层使用数组进行存储数据
    • ArrayList扩容机制每次扩容1.5倍
    展开全文
  • Java底层学习

    万次阅读 多人点赞 2018-07-18 21:30:34
    最近在看几本Java的书,也做了很多笔记,主要是关于Java虚拟机、Java GC、Java 并发编程等方面,参考的主要几本书籍有: 《深入理解Java虚拟机》——周志明 《深入理解Java虚拟机 第二版》——美 Bill Venners ...

    最近在看几本Java的书,也做了很多笔记,主要是关于Java虚拟机、Java GC、Java 并发编程等方面,参考的主要几本书籍有:

    《深入理解Java虚拟机》——周志明

    《深入理解Java虚拟机 第二版》——美 Bill Venners

    《Java性能调优指南》——也是老美的

    《Java高并发程序设计》——葛一鸣

    本来想自己把这些书的pdf传上来的,可惜已经有人上传了,大家自己去找资源吧

    当然在写作过程中也参考了很多大神的文章,下面给几个链接,大家也可以看看:

    【Java成神之路】—-死磕Java系列博客

    《成神之路系列文章》

    JVM调优总结

    等全部写完,我就写个目录方便大家查看,顺便给出一个在网络课程中看到的图:

     

    根据图中所示,我想大家也会对日后的学习应该有所思路

     

     

     

     

    展开全文
  • java底层学习

    万次阅读 多人点赞 2011-09-14 17:24:14
    额,马上就要面试了,java的底层肯定是需要了解的。...java底层主要是类的加载、连接和初始化。 本文主要分为四个方面: (1)java底层概述 (2)new和newInstance()方法的区别 (3)深入探讨java的加载机制
  • Java 底层的排序中有几个非常有用并且面试可以装逼的算法,TimSort,DualPivotQuicksort( 双轴快速排序 ),( binarySort)二分插入排序。 这三个排序,TimSort的思想非常先进并且有效,是目前排序算法中运用于...
  • JAVA底层架构

    千次阅读 2019-05-25 14:11:38
    学习Java技术体系,设计模式,流行的框架与组件。常见的设计模式,编码必备,Spring5,做应用必不可少的最新框架,MyBatis,玩数据库必不可少的组件 二:工程化与工具 工欲善其事必先利其器,不管是小白,还是...
  • java底层知识

    千次阅读 2017-11-21 15:54:52
    Java SE、Java EE、Java ME三者的区别 Java SE 是做电脑上运行的软件。 Java EE 是用来做网站的(我们常见的JSP技术)。 Java ME 是做手机软件的。 JDK、JRE、JVM三者的区别 JDK是搭建Java环境最基本的要素,...
  • Java底层堆栈的实现

    千次阅读 2013-12-17 15:02:27
    1)java底层的Stack是继承Vector的,也就是说是直接实现Collection的(满足后进先出)  class Stack extends Vector  2)向堆栈中压入数据  /**  * Pushes an item onto the top of this stack. This has ...
  • Java底层机制

    千次阅读 多人点赞 2017-09-26 10:28:08
    JVM是一种解释执行class文件的规范技术。 本文知识点包括:JVM体系结构、编译和运行过程、类加载机制、类加载过程、Java垃圾回收机制等等。
  • java底层总结

    2018-09-11 17:29:40
    equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同,该方法继承自Java的根类Object。 2, native 1, native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是...
  • ​ volatile关键字在Java中多线程编程中作为必不可少的关键字,它的作用和原理你知道多少?在我们线程之间通信有很多种方式,它主要是作用在什么方式中呢?在这种通信方式中它是通过什么方式来实现线程之间的数据...
  • 一步步深入Java底层原理(二)

    千次阅读 2017-08-15 08:13:58
    一些框架,当然还有最基础的语法就可以进行一定的开发了,但是由于Java虚拟机等一些原因,如果我们不知道其底层原理以及一些东西的实现方法的话,调试改Bug非常困难,所以我们应该有一些Java底层原理的知识。...
  • Java底层知识点

    2018-09-10 21:58:42
     执行过程,在把可执行代码转换为机器码,有底层操作系统完成执行 2.一个文件中的数据要输出到控制台上首先要建立文件输入流  首先要把文件读进来,然后在输出。所以要先建立文件输入流,在建立输出流,输出 3....
  • Java底层知识面试题

    千次阅读 2020-04-21 23:12:46
    主题 链接 Java基础知识 面试题 Java集合框架 ...Java并发编程 ...文章目录JVM内存结构class文件格式运行时数据...Java内存模型计算机内存模型缓存一致性MESI协议可见性原子性顺序性happens-before内存屏障synchron...
  • /** * @description: 玩家生成器 * @author: ly * @date: 2020/8/20 18:05 */ public class PlayerGeneral { public static AbstractPlayer general(String id) { return new PlayerModel(id);...
  • 入职一家公司。。公司用的是自己的框架。。所以熟悉底层的实现,在这个地方卡住了![图片说明](https://img-ask.csdn.net/upload/201706/06/1496740188_372849.png)
  • 一步步深入Java底层原理(一)

    千次阅读 2017-08-14 14:49:55
    接触Java也快半年时间了,但是对Java底层原理还不是非常清楚,最近在看《Java虚拟机(第二版)》,深有启发,顺便把Java知识梳理一下,以便更好的进行接下来的学习。 Java技术体系划分(按照所服务的平台划分...
  • 底层实现原理 这其实和真实的空间动态更新,朋友圈更新的远离差不多,不用的是存放数据的位置不一样,这里就存放在内存中。 首先,我们要理清有多少种对应关系: 用户与推特是一对多的关系。 用户与关注列表是一对多...
  • Java 底层知识 --- 反射

    千次阅读 2019-05-04 23:39:55
    什么是反射? getDeclaredMethod () 获取大部分公有私有的方法,不能获取私有的方法,包括实现的接口的方法 ...Method method = getDeclaredMethod ("方法名",String.class);...其中rc.getMethod 是获取public的...
  • Java NIO原理图文分析及代码实现  前言:  最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。可以...
  • java底层研究

    千次阅读 2005-06-29 19:39:00
    简述 众所周知java.exe是java class文件的执行程序,但实际上java.exe程序只是一个执行的外壳,它会装载jvm.dll(windows下,下皆以windows平台为例,linux下和solaris下其实类似,为:libjvm.so),这个动态连接库...
  • 一道面试题深入了解java底层

    千次阅读 2016-11-02 15:20:45
    Java code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
  • 作为一名优秀的 Java 开发程序员,以及想那些想要学习 Java 更深层一点的知识的同学,对源码框架的熟悉与熟练阅读与使用是必不可缺的核心技能了,也是每个 Java 程序员应该要做到的。 比如去面试时问到...
  • public class MyLock { private static ArrayList<Integer> arrayList = new ArrayList<Integer>(); private static Lock lock = new ReentrantLock(); public static <E>...}

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,971
精华内容 21,588
关键字:

java底层

java 订阅