java 面試知識點筆記(一)底層知識 jvm相關

問:談談你對java的理解?java

  • 平臺無關性(一處編譯多處運行)
  • GC(垃圾回收機制)
  • 語言特性(泛型、反射、lambda表達式)
  • 面向對象(封裝繼承多態)
  • 類庫(集合、網絡庫、併發庫、nio)
  • 異常處理

javac 將.java文件進行編譯,編譯出.class文件(二進制字節碼,包含java類中的屬性、方法、常量信息,還會有個共有的靜態常量屬性.class,這class記錄了類的相關信息及類型信息,是class的一個實例)mysql

javap 可反編譯class文件 能夠查看java編譯器生成的字節碼sql

如何跨平臺的:網絡

 

問:jvm如何加載.class文件?併發

 

問:談談反射?寫例子?jvm

理論:Java反射說的是在運行狀態中,對於任何一個類,咱們都可以知道這個類有哪些方法和屬性。對於任何一個對象,咱們都可以對它的方法和屬性進行調用。咱們把這種動態獲取對象信息和調用對象方法的功能稱之爲反射機制。函數

實例:3d

ps:getDeclaredMethod 公共的私有的包私有的方法(private、protected、public和default),即全部的均可以,可是不能獲取到繼承的,實現接口的方法code

 私有方法必須設置 .setAccessible(true)對象

getMethod 能夠獲取public方法和繼承的方法、實現接口的方法

類從編譯到執行的過程:

  1. 編譯器將Robot.java源文件編譯爲Robot.class字節碼文件
  2. ClassLoader將字節碼轉換爲JVM中的Class<Robot>對象
  3. JVM利用Class<Robot>對象實例化爲Robot對象

 

問:談談ClassLoader?

理論:ClassLoader在Java中有着很是重要的做用,它主要工做在Class裝載的加載階段,其主要做用是從系統外部得到Class二進制數據流。ClassLoader是Java的核心組件,全部的Class都是由ClassLoader進行加載的,ClassLoader負責經過各類方式將Class信息的二進制數據流讀入系統,而後交給Java虛擬機進行鏈接、初始化等操做。所以,ClassLoader在整個裝載階段,只能影響到類的加載,而沒法經過ClassLoader去改變類的鏈接和初始化行爲。

 最核心的就是 ClassLoader.java中的loadClass方法

ClassLoader的種類:

  1. BootStrapClassLoader:C++編寫,加載核心庫java.*
  2. ExtClassloader:java編寫,加載擴展庫javax.*(System.getProperty("java.ext.dirs")能夠看到擴展庫路徑)
  3. AppClassLoader:java編寫,加載程序所在目錄(System.getProperty("java.class.path")能夠看到加載路徑,最重要的是javabasic路徑)
  4. 自定義ClassLoader:java編寫,定製化加載(關鍵函數,findClass、defineClass)

類的加載方式:

  • 隱式加載:new 
  • 顯示加載:loadClass、forName等,獲取到class對象以後調用newInstance()方法來生成對象實例(newInstance不支持傳入參數,須要反射getConstructor而後調用構造器的newInstance方法傳入參數)

loadClass和forName的區別:

類的裝載過程(加載和生成實例的過程)

  • Class.forName獲得的class是已經完成初始化的
  • Classloder.loadClass獲得的class是尚未連接的
public class Robot {
    static {
        System.out.println("Hello Robot");
    }
}
public static void main(String[] args) throws ClassNotFoundException {
    //不會初始化 因此沒有打印(加快加載速度,延遲加載)
    ClassLoader cl = Robot.class.getClassLoader();
    //會初始化 因此打印了(mysql驅動就是用的這個)
    Class r = Class.forName("myclassloader.Robot");
}
相關文章
相關標籤/搜索