下面是10道java基礎(chǔ)面試題,后附答案
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請(qǐng)、網(wǎng)站空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、富川網(wǎng)站維護(hù)、網(wǎng)站推廣。
1.什么是 Java 虛擬機(jī)?為什么 Java 被稱作是“平臺(tái)無(wú)關(guān)的編程語(yǔ)言”?
Java 虛擬機(jī)是一個(gè)可以執(zhí)行 Java 字節(jié)碼的虛擬機(jī)進(jìn)程。Java 源文件被編譯成能被 Java 虛擬機(jī)執(zhí)行的字節(jié)碼文件。
Java 被設(shè)計(jì)成允許應(yīng)用程序可以運(yùn)行在任意的平臺(tái),而不需要程序員為每一個(gè)平臺(tái)單獨(dú)重寫(xiě)或者是重新編譯。Java 虛擬機(jī)讓這個(gè)變?yōu)榭赡?,因?yàn)樗赖讓佑布脚_(tái)的指令長(zhǎng)度和其他特性。
2.“static”關(guān)鍵字是什么意思?Java 中是否可以覆蓋(override)一個(gè) private 或者是static 的方法?
“static”關(guān)鍵字表明一個(gè)成員變量或者是成員方法可以在沒(méi)有所屬的類的實(shí)例變量的情況下被訪問(wèn)。
Java 中 static 方法不能被覆蓋,因?yàn)榉椒ǜ采w是基于運(yùn)行時(shí)動(dòng)態(tài)綁定的,而 static 方法是編譯時(shí)靜態(tài)綁定的。static 方法跟類的任何實(shí)例都不相關(guān),所以概念上不適用。
3.JDK 和 JRE 的區(qū)別是什么?
Java 運(yùn)行時(shí)環(huán)境(JRE)是將要執(zhí)行 Java 程序的 Java 虛擬機(jī)。它同時(shí)也包含了執(zhí)行 applet 需要的瀏覽器插件。Java 開(kāi)發(fā)工具包 (JDK)是完整的 Java 軟件開(kāi)發(fā)包,包含了 JRE,編譯器和其他的工具(比如:JavaDoc,Java 調(diào)試器),可以讓開(kāi)發(fā)者開(kāi)發(fā)、編譯、執(zhí)行 Java 應(yīng)用程序。
4.是否可以在 static 環(huán)境中訪問(wèn)非 static 變量?
static 變量在 Java 中是屬于類的,它在所有的實(shí)例中的值是一樣的。當(dāng)類被 Java 虛擬機(jī)載入的時(shí)候,會(huì)對(duì) static 變量進(jìn)行初始化。如果你的代碼嘗試不用實(shí)例來(lái)訪問(wèn)非 static 的變量,編譯器會(huì)報(bào)錯(cuò),因?yàn)檫@些變量還沒(méi)有被創(chuàng)建出來(lái),還沒(méi)有跟任何實(shí)例關(guān)聯(lián)上。
5.Java 支持的數(shù)據(jù)類型有哪些?什么是自動(dòng)拆裝箱?
Java 語(yǔ)言支持的 8 中基本數(shù)據(jù)類型是:
?byte
?short
?int
?long
?float
?double
?boolean
?char
自動(dòng)裝箱是 Java 編譯器在基本數(shù)據(jù)類型和對(duì)應(yīng)的對(duì)象包裝類型之間做的一個(gè)轉(zhuǎn)化。比如:把 int 轉(zhuǎn)化成 Integer,double 轉(zhuǎn)化成 double,等等。反之就是自動(dòng)拆箱。
6.Java 支持多繼承么?
不支持,Java 不支持多繼承。每個(gè)類都只能繼承一個(gè)類,但是可以實(shí)現(xiàn)多個(gè)接口。
7.Java 中,什么是構(gòu)造函數(shù)?什么是構(gòu)造函數(shù)重載?什么是復(fù)制構(gòu)造函數(shù)?
當(dāng)新對(duì)象被創(chuàng)建的時(shí)候,構(gòu)造函數(shù)會(huì)被調(diào)用。每一個(gè)類都有構(gòu)造函數(shù)。在程序員沒(méi)有給類提供構(gòu)造函數(shù)的情況下,Java 編譯器會(huì)為這個(gè)類創(chuàng)建一個(gè)默認(rèn)的構(gòu)造函數(shù)。
Java 中構(gòu)造函數(shù)重載和方法重載很相似??梢詾橐粋€(gè)類創(chuàng)建多個(gè)構(gòu)造函數(shù)。每一個(gè)構(gòu)造函數(shù)必須有它自己唯一的參數(shù)列表。
Java 不支持像 C++中那樣的復(fù)制構(gòu)造函數(shù),這個(gè)不同點(diǎn)是因?yàn)槿绻悴蛔约簩?xiě)構(gòu)造函數(shù)的情況下,Java 不會(huì)創(chuàng)建默認(rèn)的復(fù)制構(gòu)造函數(shù)。
8.Java 中的方法覆蓋(Overriding)和方法重載(Overloading)是什么意思?
Java 中的方法重載發(fā)生在同一個(gè)類里面兩個(gè)或者是多個(gè)方法的方法名相同但是參數(shù)不同的情況。與此相對(duì),方法覆蓋是說(shuō)子類重新定義了父類的方法。方法覆蓋必須有相同的方法名,參數(shù)列表和返回類型。覆蓋者可能不會(huì)限制它所覆蓋的方法的訪問(wèn)。
9.接口和抽象類的區(qū)別是什么?
Java 提供和支持創(chuàng)建抽象類和接口。它們的實(shí)現(xiàn)有共同點(diǎn),不同點(diǎn)在于:
?接口中所有的方法隱含的都是抽象的。而抽象類則可以同時(shí)包含抽象和非抽象的方法。
?類可以實(shí)現(xiàn)很多個(gè)接口,但是只能繼承一個(gè)抽象類
?類如果要實(shí)現(xiàn)一個(gè)接口,它必須要實(shí)現(xiàn)接口聲明的所有方法。但是,類可以不實(shí)現(xiàn)抽象類聲明的所有方法,當(dāng)然,在這種情況下,類也必須得聲明成是抽象的。
?抽象類可以在不提供接口方法實(shí)現(xiàn)的情況下實(shí)現(xiàn)接口。
?Java 接口中聲明的變量默認(rèn)都是 final 的。抽象類可以包含非 final 的變量。
?Java 接口中的成員函數(shù)默認(rèn)是 public 的。抽象類的成員函數(shù)可以是 private, protected 或者是 public。
?接口是絕對(duì)抽象的,不可以被實(shí)例化。抽象類也不可以被實(shí)例化,但是,如果它包含 main 方法的話是可以被調(diào)用的。
10.什么是值傳遞和引用傳遞?
對(duì)象被值傳遞,意味著傳遞了對(duì)象的一個(gè)副本。因此,就算是改變了對(duì)象副本,也不會(huì)影響源對(duì)象的值。
對(duì)象被引用傳遞,意味著傳遞的并不是實(shí)際的對(duì)象,而是對(duì)象的引用。因此,外部對(duì)引用對(duì)象所做的改變會(huì)反映到所有的對(duì)象上。
最后祝你面試順利!
不論是物理機(jī)還是虛擬機(jī),大部分的程序代碼從開(kāi)始編譯到最終轉(zhuǎn)化成物理機(jī)的目標(biāo)代碼或虛擬機(jī)能執(zhí)行的指令集之前,都會(huì)按照如下圖所示的各個(gè)步驟進(jìn)行:
其中綠色的模塊可以選擇性實(shí)現(xiàn)。很容易看出,上圖中間的那條分支是解釋執(zhí)行的過(guò)程(即一條字節(jié)碼一條字節(jié)碼地解釋執(zhí)行,如JavaScript),而下面的那條分支就是傳統(tǒng)編譯原理中從源代碼到目標(biāo)機(jī)器代碼的生成過(guò)程。
如今,基于物理機(jī)、虛擬機(jī)等的語(yǔ)言,大多都遵循這種基于現(xiàn)代經(jīng)典編譯原理的思路,在執(zhí)行前先對(duì)程序源碼進(jìn)行詞法解析和語(yǔ)法解析處理,把源碼轉(zhuǎn)化為抽象語(yǔ)法樹(shù)。對(duì)于一門具體語(yǔ)言的實(shí)現(xiàn)來(lái)說(shuō),詞法和語(yǔ)法分析乃至后面的優(yōu)化器和目標(biāo)代碼生成器都可以選擇獨(dú)立于執(zhí)行引擎,形成一個(gè)完整意義的編譯器去實(shí)現(xiàn),這類代表是C/C++語(yǔ)言。也可以把抽象語(yǔ)法樹(shù)或指令流之前的步驟實(shí)現(xiàn)一個(gè)半獨(dú)立的編譯器,這類代表是Java語(yǔ)言。又或者可以把這些步驟和執(zhí)行引擎全部集中在一起實(shí)現(xiàn),如大多數(shù)的JavaScript執(zhí)行器。
Javac編譯
在Java中提到“編譯”,自然很容易想到Javac編譯器將*.java文件編譯成為*.class文件的過(guò)程,這里的Javac編譯器稱為前端編譯器,其他的前端編譯器還有諸如Eclipse?JDT中的增量式編譯器ECJ等。相對(duì)應(yīng)的還有后端編譯器,它在程序運(yùn)行期間將字節(jié)碼轉(zhuǎn)變成機(jī)器碼(現(xiàn)在的Java程序在運(yùn)行時(shí)基本都是解釋執(zhí)行加編譯執(zhí)行),如HotSpot虛擬機(jī)自帶的JIT(Just?In?Time?Compiler)編譯器(分Client端和Server端)。另外,有時(shí)候還有可能會(huì)碰到靜態(tài)提前編譯器(AOT,Ahead?Of?Time?Compiler)直接把*.java文件編譯成本地機(jī)器代碼,如GCJ、Excelsior?JET等,這類編譯器我們應(yīng)該比較少遇到。
下面簡(jiǎn)要說(shuō)下Javac編譯(前端編譯)的過(guò)程。
詞法、語(yǔ)法分析
詞法分析是將源代碼的字符流轉(zhuǎn)變?yōu)闃?biāo)記(Token)集合。單個(gè)字符是程序編寫(xiě)過(guò)程中的的最小元素,而標(biāo)記則是編譯過(guò)程的最小元素,關(guān)鍵字、變量名、字面量、運(yùn)算符等都可以成為標(biāo)記,比如整型標(biāo)志int由三個(gè)字符構(gòu)成,但是它只是一個(gè)標(biāo)記,不可拆分。
語(yǔ)法分析是根據(jù)Token序列來(lái)構(gòu)造抽象語(yǔ)法樹(shù)的過(guò)程。抽象語(yǔ)法樹(shù)是一種用來(lái)描述程序代碼語(yǔ)法結(jié)構(gòu)的樹(shù)形表示方式,語(yǔ)法樹(shù)的每一個(gè)節(jié)點(diǎn)都代表著程序代碼中的一個(gè)語(yǔ)法結(jié)構(gòu),如bao、類型、修飾符、運(yùn)算符等。經(jīng)過(guò)這個(gè)步驟后,編譯器就基本不會(huì)再對(duì)源碼文件進(jìn)行操作了,后續(xù)的操作都建立在抽象語(yǔ)法樹(shù)之上。
填充符號(hào)表
完成了語(yǔ)法分析和詞法分析之后,下一步就是填充符號(hào)表的過(guò)程。符號(hào)表是由一組符號(hào)地址和符號(hào)信息構(gòu)成的表格。符號(hào)表中所登記的信息在編譯的不同階段都要用到,在語(yǔ)義分析(后面的步驟)中,符號(hào)表所登記的內(nèi)容將用于語(yǔ)義檢查和產(chǎn)生中間代碼,在目標(biāo)代碼生成階段,黨對(duì)符號(hào)名進(jìn)行地址分配時(shí),符號(hào)表是地址分配的依據(jù)。
語(yǔ)義分析
語(yǔ)法樹(shù)能表示一個(gè)結(jié)構(gòu)正確的源程序的抽象,但無(wú)法保證源程序是符合邏輯的。而語(yǔ)義分析的主要任務(wù)是讀結(jié)構(gòu)上正確的源程序進(jìn)行上下文有關(guān)性質(zhì)的審查。語(yǔ)義分析過(guò)程分為標(biāo)注檢查和數(shù)據(jù)及控制流分析兩個(gè)步驟:
標(biāo)注檢查步驟檢查的內(nèi)容包括諸如變量使用前是否已被聲明、變量和賦值之間的數(shù)據(jù)類型是否匹配等。
數(shù)據(jù)及控制流分析是對(duì)程序上下文邏輯更進(jìn)一步的驗(yàn)證,它可以檢查出諸如程序局部變量在使用前是否有賦值、方法的每條路徑是否都有返回值、是否所有的受查異常都被正確處理了等問(wèn)題。
字節(jié)碼生成
字節(jié)碼生成是Javac編譯過(guò)程的最后一個(gè)階段。字節(jié)碼生成階段不僅僅是把前面各個(gè)步驟所生成的信息轉(zhuǎn)化成字節(jié)碼寫(xiě)到磁盤(pán)中,編譯器還進(jìn)行了少量的代碼添加和轉(zhuǎn)換工作。?實(shí)例構(gòu)造器init()方法和類構(gòu)造器clinit()方法就是在這個(gè)階段添加到語(yǔ)法樹(shù)之中的(這里的實(shí)例構(gòu)造器并不是指默認(rèn)的構(gòu)造函數(shù),而是指我們自己重載的構(gòu)造函數(shù),如果用戶代碼中沒(méi)有提供任何構(gòu)造函數(shù),那編譯器會(huì)自動(dòng)添加一個(gè)沒(méi)有參數(shù)、訪問(wèn)權(quán)限與當(dāng)前類一致的默認(rèn)構(gòu)造函數(shù),這個(gè)工作在填充符號(hào)表階段就已經(jīng)完成了)。
JIT編譯
Java程序最初是僅僅通過(guò)解釋器解釋執(zhí)行的,即對(duì)字節(jié)碼逐條解釋執(zhí)行,這種方式的執(zhí)行速度相對(duì)會(huì)比較慢,尤其當(dāng)某個(gè)方法或代碼塊運(yùn)行的特別頻繁時(shí),這種方式的執(zhí)行效率就顯得很低。于是后來(lái)在虛擬機(jī)中引入了JIT編譯器(即時(shí)編譯器),當(dāng)虛擬機(jī)發(fā)現(xiàn)某個(gè)方法或代碼塊運(yùn)行特別頻繁時(shí),就會(huì)把這些代碼認(rèn)定為“Hot?Spot?Code”(熱點(diǎn)代碼),為了提高熱點(diǎn)代碼的執(zhí)行效率,在運(yùn)行時(shí),虛擬機(jī)將會(huì)把這些代碼編譯成與本地平臺(tái)相關(guān)的機(jī)器碼,并進(jìn)行各層次的優(yōu)化,完成這項(xiàng)任務(wù)的正是JIT編譯器。
現(xiàn)在主流的商用虛擬機(jī)(如Sun?HotSpot、IBM?J9)中幾乎都同時(shí)包含解釋器和編譯器(三大商用虛擬機(jī)之一的JRockit是個(gè)例外,它內(nèi)部沒(méi)有解釋器,因此會(huì)有啟動(dòng)相應(yīng)時(shí)間長(zhǎng)之類的缺點(diǎn),但它主要是面向服務(wù)端的應(yīng)用,這類應(yīng)用一般不會(huì)重點(diǎn)關(guān)注啟動(dòng)時(shí)間)。二者各有優(yōu)勢(shì):當(dāng)程序需要迅速啟動(dòng)和執(zhí)行時(shí),解釋器可以首先發(fā)揮作用,省去編譯的時(shí)間,立即執(zhí)行;當(dāng)程序運(yùn)行后,隨著時(shí)間的推移,編譯器逐漸會(huì)返回作用,把越來(lái)越多的代碼編譯成本地代碼后,可以獲取更高的執(zhí)行效率。解釋執(zhí)行可以節(jié)約內(nèi)存,而編譯執(zhí)行可以提升效率。
HotSpot虛擬機(jī)中內(nèi)置了兩個(gè)JIT編譯器:Client?Complier和Server?Complier,分別用在客戶端和服務(wù)端,目前主流的HotSpot虛擬機(jī)中默認(rèn)是采用解釋器與其中一個(gè)編譯器直接配合的方式工作。
運(yùn)行過(guò)程中會(huì)被即時(shí)編譯器編譯的“熱點(diǎn)代碼”有兩類:
被多次調(diào)用的方法。
被多次調(diào)用的循環(huán)體。
兩種情況,編譯器都是以整個(gè)方法作為編譯對(duì)象,這種編譯也是虛擬機(jī)中標(biāo)準(zhǔn)的編譯方式。要知道一段代碼或方法是不是熱點(diǎn)代碼,是不是需要觸發(fā)即時(shí)編譯,需要進(jìn)行Hot?Spot?Detection(熱點(diǎn)探測(cè))。目前主要的熱點(diǎn)?判定方式有以下兩種:
基于采樣的熱點(diǎn)探測(cè):采用這種方法的虛擬機(jī)會(huì)周期性地檢查各個(gè)線程的棧頂,如果發(fā)現(xiàn)某些方法經(jīng)常出現(xiàn)在棧頂,那這段方法代碼就是“熱點(diǎn)代碼”。這種探測(cè)方法的好處是實(shí)現(xiàn)簡(jiǎn)單高效,還可以很容易地獲取方法調(diào)用關(guān)系,缺點(diǎn)是很難精確地確認(rèn)一個(gè)方法的熱度,容易因?yàn)槭艿骄€程阻塞或別的外界因素的影響而擾亂熱點(diǎn)探測(cè)。
基于計(jì)數(shù)器的熱點(diǎn)探測(cè):采用這種方法的虛擬機(jī)會(huì)為每個(gè)方法,甚至是代碼塊建立計(jì)數(shù)器,統(tǒng)計(jì)方法的執(zhí)行次數(shù),如果執(zhí)行次數(shù)超過(guò)一定的閥值,就認(rèn)為它是“熱點(diǎn)方法”。這種統(tǒng)計(jì)方法實(shí)現(xiàn)復(fù)雜一些,需要為每個(gè)方法建立并維護(hù)計(jì)數(shù)器,而且不能直接獲取到方法的調(diào)用關(guān)系,但是它的統(tǒng)計(jì)結(jié)果相對(duì)更加精確嚴(yán)謹(jǐn)。
在HotSpot虛擬機(jī)中使用的是第二種——基于計(jì)數(shù)器的熱點(diǎn)探測(cè)方法,因此它為每個(gè)方法準(zhǔn)備了兩個(gè)計(jì)數(shù)器:方法調(diào)用計(jì)數(shù)器和回邊計(jì)數(shù)器。
方法調(diào)用計(jì)數(shù)器用來(lái)統(tǒng)計(jì)方法調(diào)用的次數(shù),在默認(rèn)設(shè)置下,方法調(diào)用計(jì)數(shù)器統(tǒng)計(jì)的并不是方法被調(diào)用的絕對(duì)次數(shù),而是一個(gè)相對(duì)的執(zhí)行頻率,即一段時(shí)間內(nèi)方法被調(diào)用的次數(shù)。
回邊計(jì)數(shù)器用于統(tǒng)計(jì)一個(gè)方法中循環(huán)體代碼執(zhí)行的次數(shù)(準(zhǔn)確地說(shuō),應(yīng)該是回邊的次數(shù),因?yàn)椴⒎撬械难h(huán)都是回邊),在字節(jié)碼中遇到控制流向后跳轉(zhuǎn)的指令就稱為“回邊”。
在確定虛擬機(jī)運(yùn)行參數(shù)的前提下,這兩個(gè)計(jì)數(shù)器都有一個(gè)確定的閥值,當(dāng)計(jì)數(shù)器的值超過(guò)了閥值,就會(huì)觸發(fā)JIT編譯。觸發(fā)了JIT編譯后,在默認(rèn)設(shè)置下,執(zhí)行引擎并不會(huì)同步等待編譯請(qǐng)求完成,而是繼續(xù)進(jìn)入解釋器按照解釋方式執(zhí)行字節(jié)碼,直到提交的請(qǐng)求被編譯器編譯完成為止(編譯工作在后臺(tái)線程中進(jìn)行)。當(dāng)編譯工作完成后,下一次調(diào)用該方法或代碼時(shí),就會(huì)使用已編譯的版本。
由于方法計(jì)數(shù)器觸發(fā)即時(shí)編譯的過(guò)程與回邊計(jì)數(shù)器觸發(fā)即時(shí)編譯的過(guò)程類似,因此這里僅給出方法調(diào)用計(jì)數(shù)器觸發(fā)即時(shí)編譯的流程:
以下從技術(shù)角度就常見(jiàn)的保護(hù)措施 和常用工具來(lái)看看如何有效保護(hù)java代碼:1. 將java包裝成exe 特點(diǎn):將jar包裝成可執(zhí)行文件,便于使用,但對(duì)java程序沒(méi)有任何保護(hù)。不要以為生成了exe就和普通可執(zhí)行文件效果一樣了。這些包裝成exe的程序運(yùn)行時(shí)都會(huì)將jar文件釋放到臨時(shí)目錄,很容易獲取。常用的工具有exe4j、jsmooth、NativeJ等等。jsmooth生成的exe運(yùn)行時(shí)臨時(shí)目錄在exe所在目錄中或是用戶臨時(shí)目錄 中;exe4j生成的exe運(yùn)行時(shí)臨時(shí)目錄在用戶臨時(shí)目錄中;NativeJ生成的exe直接用winrar打開(kāi),然后用zip格式修復(fù)成一個(gè)jar文件,就得到了原文件。如果只是為了使用和發(fā)布方便,不需要保護(hù)java代碼,使用這些工具是很好的選擇。2. java混淆器特點(diǎn):使用一種或多種處理方式將class文件、java源代碼進(jìn)行混淆處理后生成新的class,使混淆后的代碼不易被反編譯,而反編譯后的代碼難以閱 讀和理解。這類混淆器工具很多,而且也很有成效。缺點(diǎn):雖然混淆的代碼反編譯后不易讀懂,但對(duì)于有經(jīng)驗(yàn)的人或是多花些時(shí)間,還是能找到或計(jì)算出你代碼中隱藏的敏感內(nèi)容,而且在很多應(yīng)用中不是全部代碼都能混淆的,往往一些關(guān)鍵的庫(kù)、類名、方法名、變量名等因使用要求的限制反而還不能混淆。3. 隔離java程序到服務(wù)端特點(diǎn):把java程序放到服務(wù)端,讓用戶不能訪問(wèn)到class文件和相關(guān)配套文件,客戶端只通過(guò)接口訪問(wèn)。這種方式在客戶/服務(wù)模式的應(yīng)用中能較好地保護(hù)java代碼。缺點(diǎn)是:必須是客戶/服務(wù)模式,這種特點(diǎn)限制了此種方式的使用范圍;客戶端因?yàn)檫壿嫷谋┞妒冀K是較為薄弱的環(huán)節(jié),所以訪問(wèn)接口時(shí)一般都需要安全性認(rèn)證。4. java加密保護(hù)特點(diǎn):自定義ClassLoader,將class文件和相關(guān)文件加密,運(yùn)行時(shí)由此ClassLoader解密相關(guān)文件并裝載類,要起到保護(hù)作用必須自定 義本地代碼執(zhí)行器將自定義ClassLoader和加密解密的相關(guān)類和配套文件也保護(hù)起來(lái)。此種方式能很有效地保護(hù)java代碼。缺點(diǎn):可以通過(guò)替換JRE包中與類裝載相關(guān)的java類或虛擬機(jī)動(dòng)態(tài)庫(kù)截獲java字節(jié)碼。 jar2exe屬于這類工具。5. 提前編譯技術(shù)(AOT) 特點(diǎn):將java代碼靜態(tài)編譯成本地機(jī)器碼,脫離通用JRE。此種方式能夠非常有效地保護(hù)java代碼,且程序啟動(dòng)比通用JVM快一點(diǎn)。具有代表性的是GNU的gcj,可以做到對(duì)java代碼完全提前編譯,但gcj存在諸多局限性,如:對(duì)JRE 5不能完整支持、不支持JRE 6及以后的版本。由于java平臺(tái)的復(fù)雜性,做到能及時(shí)支持最新java版本和JRE的完全提前編譯是非常困難的,所以這類工具往往采取靈活方式,該用即時(shí)編譯的地方還是 要用,成為提前編譯和即時(shí)編譯的混合體。缺點(diǎn):由于與通用JRE的差異和java運(yùn)用中的復(fù)雜性,并非java程序中的所有jar都能得到完全的保護(hù);只能使用此種工具提供的一個(gè)運(yùn)行環(huán)境,如果工具更新滯后或你需要特定版本的JRE,有可能得不到此種工具的支持。 Excelsior JET屬于這類工具。6. 使用jni方式保護(hù)特點(diǎn):將敏感的方法和數(shù)據(jù)通過(guò)jni方式處理。此種方式和“隔離java程序到服務(wù)端”有些類似,可以看作把需要保護(hù)的代碼和數(shù)據(jù)“隔離”到動(dòng)態(tài)庫(kù)中,不同的是可以在單機(jī)程序中運(yùn)用。缺點(diǎn)和上述“隔離java程序到服務(wù)端”類似。7. 不脫離JRE的綜合方式保護(hù)特點(diǎn):非提前編譯,不脫離JRE,采用多種軟保護(hù)方式,從多方面防止java程序被竊取。此種方式由于采取了多種保護(hù)措施,比如自定義執(zhí)行器和裝載器、加密、JNI、安全性檢測(cè)、生成可執(zhí)行文件等等,使保護(hù)力度大大增強(qiáng),同樣能夠非常有效地保護(hù)java代碼。缺點(diǎn):由于jar文件存在方式的改變和java運(yùn)用中的復(fù)雜性,并非java程序中的所有jar都能得到完全的保護(hù);很有可能并不支持所有的JRE版本。 JXMaker屬于此類工具。8. 用加密鎖硬件保護(hù)特點(diǎn):使用與硬件相關(guān)的專用程序?qū)ava虛擬機(jī)啟動(dòng)程序加殼,將虛擬機(jī)配套文件和java程序加密,啟動(dòng)的是加殼程序,由加殼程序建立一個(gè)與硬件相關(guān)的 受保護(hù)的運(yùn)行環(huán)境,為了加強(qiáng)安全性可以和加密鎖內(nèi)植入的程序互動(dòng)。此種方式與以上“不脫離JRE的綜合方式保護(hù)”相似,只是使用了專用硬件設(shè)備,也能很好地保護(hù)java代碼。缺點(diǎn):有人認(rèn)為加密鎖用戶使用上不太方便,且每個(gè)安裝需要附帶一個(gè)。從以上描述中我們可以看出:1. 各種保護(hù)方式都有其優(yōu)缺點(diǎn),應(yīng)根據(jù)實(shí)際選用2. 要更好地保護(hù)java代碼應(yīng)該使用綜合的保護(hù)措施3. 單機(jī)環(huán)境中要真正有效保護(hù)java代碼,必須要有本地代碼程序配合當(dāng)然,安全都是相對(duì)的,一方面看你的保護(hù)措施和使用的工具能達(dá)到的程度,一方面看黑客的意愿和能力,不能只從技術(shù)上保護(hù)知識(shí)產(chǎn)權(quán)??傊?,在java 代碼保護(hù)方面可以采取各種可能的方式,不可拘泥于那些條條框框。
文章標(biāo)題:java源代碼進(jìn)行aot java iterator源碼
文章出自:http://www.rwnh.cn/article22/doppjcc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、響應(yīng)式網(wǎng)站、自適應(yīng)網(wǎng)站、外貿(mào)建站、建站公司、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)