本文目錄一覽:
- 1、北大青鳥java培訓:位元組碼指令的編譯與執行?
- 2、將hello.java文件,編譯為位元組碼文件需要鍵入什麼命令
- 3、java的位元組碼文件類型是什麼?
- 4、深入Java位元組碼加密
- 5、什麼是Java位元組碼?
北大青鳥java培訓:位元組碼指令的編譯與執行?
java編程開發是目前市場上使用範圍非常廣泛的一種編程開發語言。
今天我們就一起來了解一下,在java編程中關於位元組碼的一些指令的編譯與執行方法。
java文件編譯後的class文件,java跨平台的中間層,JVM通過對位元組碼的解釋執行(執行模式,還有JIT編譯執行,下面講解),屏蔽對操作系統的依賴。
一個位元組(8位)可以儲存256中不同的指令,這樣的指令就是位元組碼,java所有指令有200個左右,這些指令組成了位元組碼文件(.class)。
一、位元組碼的主要指令:.class文件裡面的十六進位文件,其中CAFEBABE是標誌這個文件為java的編譯後的文件,00000034代表版本號,01670700一個位元組(8位)就是一個位元組指令,由於數值指令太難看懂,我們可以用javap將指令翻譯為助記指令。
1、載入或儲存指令在棧幀中,通過指令操作數據在局部變數表與操作棧間傳遞。
ILOAD、ALOAD:將int、對象引用類型從局部變數表壓入操作棧頂;ISTORE、ASTORE:將int、對象引用類型從操作棧頂儲存到局部變數表裡;ICONST、BIPUSH、SIPUSH、LDC:將常亮載入到操作棧頂。
2、運算指令對操作棧上的值進行運算,並把結果寫入操作棧頂,如IADD、IMUL。
3、類型轉換指令I2L、D2F4、對象創建與訪問指令NEW除了位元組碼指令外,海南電腦培訓認為還包括像LINENUMBER儲存位元組碼與源碼對應,方便調試定位;LOCALVARIABLE儲存當前方法使用到的局部表量表。
二、java源碼文件轉化為位元組碼(.class)文件的過程JAVA源文件———-詞法解析———-語法解析———-語義分析———生成位元組碼———位元組碼文件詞法分析:根據空格分割出單詞、操作符等,形成token信息流;語法分析:根據token流和java語法規範生成語法樹;語義分析:檢查關鍵字、類型匹配是否正確;
將hello.java文件,編譯為位元組碼文件需要鍵入什麼命令
1、在java文件所在文件夾輸入cmd進入doc窗口命令行界面。
2、輸入java命令:javacHello.java將java文件編譯成位元組碼.class文件。
3、輸入java命令:javaHello運行java位元組碼.class文件。
java的位元組碼文件類型是什麼?
源文件的文件名要和其源代碼中的類名一致
比如你寫了個類 class test {….}那麼存儲這個類的源文件就是test.java
編譯通過後會生成test.class的位元組碼文件
深入Java位元組碼加密
問 如果我把我的class文件加密 在運行時用指定的類載入器(class loader)裝入並解密它 這樣子能防止被反編譯嗎? 答 防止JAVA位元組碼反編譯這個問題在java語言雛形期就有了 儘管市面上存在一些反編譯的工具可以利用 但是JAVA程序員還是不斷的努力尋找新的更有效的方法來保護他們的智慧結晶 在此 我將詳細給大家解釋這一直來在論壇上有爭議的話題 Class文件能被很輕鬆的重構生成JAVA源文件與最初JAVA位元組碼的設計目的和商業交易有緊密地聯繫 另外 JAVA位元組碼被設計成簡潔 平台獨立性 網路靈活性 並且易於被位元組碼解釋器和JIT (just in time)/HotSpot 編譯器所分析 可以清楚地了解程序員的目的 Class文件要比JAVA源文件更易於分析 如果不能阻止被反編譯的話 至少可以通過一些方法來增加它的困難性 例如: 在一個分步編譯里 你可以打亂Class文件的數據以使其難讀或者難以被反編譯成正確的JAVA源文件 前者可以採用極端函數重載 後者用操作控制流建立控制結構使其難以恢復正常次序 有更多成功的商業困惑者採用這些或其他的技術來保護自己的代碼 不幸的是 哪種方法都必須改變JVM運行的代碼 並且許多用戶害怕這種轉化會給他們的程序帶來新的Bug 而且 方法和欄位重命名會調用反射從而使程序停止工作 改變類和包的名字會破壞其他的JAVA APIS(JNDI URL providers etc) 除了改變名字 如果位元組碼偏移量和源代碼行數之間的關係改變了 在恢復這有異常的堆棧將很困難 於是就有了一些打亂JAVA源代碼的選項 但是這將從本質上導致一系列問題的產生 加密而不打亂 或許上述可能會使你問 假如我把位元組碼加密而不是處理位元組碼 並且JVM運行時自動將它解密並裝入類載入器 然後JVM運行解密後的位元組碼文件 這樣就不會被反編譯了對嗎?考慮到你是第一個提出這種想法的並且它又能正常運行 我表示遺憾和不幸 這種想法是錯誤的 下面是一個簡單的類編碼器 為了闡明這種思想 我採用了一個實例和一個很通用的類載入器來運行它 該程序包括兩個類 public class Main{public static void main (final String [] args){ System out println ( secret result = + MySecretClass mySecretAlgorithm ());}} // End of classpackage de;import java util Random;public class MySecretClass{/** * Guess what the secret algorithm just uses a random number generator */public static int mySecretAlgorithm (){return (int) s_random nextInt ();}private static final Random s_random = new Random (System currentTimeMillis ());} // End of class我想通過加密相關的class文件並在運行期解密來隱藏de MySecretClass的執行 用下面這個工具可以達到效果(你可以到這裡下載Resources) public class EncryptedClassLoader extends URLClassLoader{public static void main (final String [] args)throws Exception{if ( run equals (args [ ]) (args length = )){// Create a custom loader that will use the current loader as// delegation parent:final ClassLoader appLoader =new EncryptedClassLoader (EncryptedClassLoader class getClassLoader () new File (args [ ]));// Thread context loader must be adjusted as well:Thread currentThread () setContextClassLoader (appLoader);final Class app = appLoader loadClass (args [ ]);final Method appmain = app getMethod ( main new Class [] {String [] class});final String [] appargs = new String [args length ];System arraycopy (args appargs appargs length);appmain invoke (null new Object [] {appargs});}else if ( encrypt equals (args [ ]) (args length = )){ encrypt specified classes }elsethrow new IllegalArgumentException (USAGE);}/** * Overrides java lang ClassLoader loadClass() to change the usual parent child * delegation rules just enough to be able to snatch application classes * from under system classloader s nose */public Class loadClass (final String name final boolean resolve)throws ClassNotFoundException{if (TRACE) System out println ( loadClass ( + name + + resolve + ) );Class c = null;// First check if this class has already been defined by this classloader// instance:c = findLoadedClass (name);if (c == null){Class parentsVersion = null;try{// This is slightly unorthodox: do a trial load via the// parent loader and note whether the parent delegated or not;// what this acplishes is proper delegation for all core// and extension classes without my having to filter on class name: parentsVersion = getParent () loadClass (name);if (parentsVersion getClassLoader () != getParent ())c = parentsVersion;}catch (ClassNotFoundException ignore) {}catch (ClassFormatError ignore) {}if (c == null){try{// OK either c was loaded by the system (not the bootstrap// or extension) loader (in which case I want to ignore that// definition) or the parent failed altogether; either way I// attempt to define my own version:c = findClass (name);}catch (ClassNotFoundException ignore){// If that failed fall back on the parent s version// [which could be null at this point]:c = parentsVersion;}}}if (c == null)throw new ClassNotFoundException (name);if (resolve)resolveClass (c);return c;}/** * Overrides java new URLClassLoader defineClass() to be able to call * crypt() before defining a class */protected Class findClass (final String name)throws ClassNotFoundException{if (TRACE) System out println ( findClass ( + name + ) );// class files are not guaranteed to be loadable as resources;// but if Sun s code does it so perhaps can mine final String classResource = name replace ( / ) + class ;final URL classURL = getResource (classResource);if (classURL == null)throw new ClassNotFoundException (name);else{InputStream in = null;try{in = classURL openStream ();final byte [] classBytes = readFully (in); lishixinzhi/Article/program/Java/hx/201311/25555
什麼是Java位元組碼?
零基礎學習java可按照這份大綱來進行學習
第一階段:Java專業基礎課程
階段目標:
1. 熟練掌握Java的開發環境與編程核心知識
2. 熟練運用Java面向對象知識進行程序開發
3. 對Java的核心對象和組件有深入理解
4. 熟練應用JavaAPI相關知識
5. 熟練應用JAVA多線程技術
6. 能綜合運用所學知識完成一個項目
知識點:
1、基本數據類型,運算符,數組,掌握基本數據類型轉換,運算符,流程式控制制。
2、數組,排序演算法,Java常用API,類和對象,了解類與對象,熟悉常用API。
3、面向對象特性,集合框架,熟悉面向對象三大特性,熟練使用集合框架。
4、IO流,多線程。
5、網路協議,線程運用。
第二階段:JavaWEB核心課程
階段目標:
1. 熟練掌握資料庫和MySQL核心技術
2. 深入理解JDBC與DAO資料庫操作
3. 熟練運用JSP及Servlet技術完成網站後台開發
4. 深入理解緩存,連接池,註解,反射,泛型等知識
5. 能夠運用所學知識完成自定義框架
知識點:
1、資料庫知識,範式,MySQL配置,命令,建庫建表,數據的增刪改查,約束,視圖,存儲過程,函數,觸發器,事務,游標,建模工具。
2、深入理解資料庫管理系統通用知識及MySQL資料庫的使用與管理。為Java後台開發打下堅實基礎。Web頁面元素,布局,CSS樣式,盒模型,JavaScript,jQuery。
3、掌握前端開發技術,掌握jQuery。
4、Servlet,EL表達式,會話跟蹤技術,過濾器,FreeMarker。
5、掌握Servlet相關技術,利用Servlet,JSP相關應用技術和DAO完成B/S架構下的應用開發。
6、泛型,反射,註解。
7、掌握JAVA高級應用,利用泛型,註解,枚舉完成自己的CRUD框架開發為後續框架學習做鋪墊。
8、單點登錄,支付功能,項目整合,分頁封裝熟練運用JSP及Servlet核心知識完成項目實戰。
第三階段:JavaEE框架課程
階段目標:
1. 熟練運用Linux操作系統常見命令及完成環境部署和Nginx伺服器的配置
2. 熟練運用JavaEE三大核心框架:Spring,SpringMVC,MyBatis
3. 熟練運用Maven,並使用SpringBoot進行快速框架搭建
4. 深入理解框架的實現原理,Java底層技術,企業級應用等
5. 使用Shiro,Ztree和Spring,SpringMVC,Mybaits完成企業項目
知識點:
1、Linux安裝配置,文件目錄操作,VI命令,管理,用戶與許可權,環境部署,Struts2概述,hiberante概述。
2、Linux作為一個主流的伺服器操作系統,是每一個開發工程師必須掌握的重點技術,並且能夠熟練運用。
3、SSH的整合,MyBatis,SpringMVC,Maven的使用。
4、了解AOP原理,了解中央控制器原理,掌握MyBatis框架,掌握SSM框架的整合。
5、Shiro,Ztree,項目文檔,項目規範,需求分析,原型圖設計,資料庫設計,工程構建,需求評審,配置管理,BUG修復,項目管理等。
6、獨立自主完成一個中小型的企業級綜合項目的設計和整體架構的原型和建模。獨立自主完成一個大型的企業級綜合項目,並具備商業價值
原創文章,作者:HDWT,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/131341.html