總網頁瀏覽量

2016年1月12日 星期二

Byte Code Editing Library (BCEL)

Byte Code Editing Library (BCEL)

http://set.ee/jbe/

下載 Download: Java Bytecode Editor 0.1.1

會得到一份 jbe-0.1.1.zip,
解壓縮得到 jbe 資料夾, 裡面會有
1. bin_資料夾
2. src_資料夾
3. COPYING_text
4. jbe_window Batch File
5. jbe.sh_SH FILE
6.version_text


Java Virtual Machine

C語言的開發模式, 是編寫.c的Source Code, 再經由Compiler編譯成Object Code。

所謂Object Code指的是和硬體相關的機器指令, 也就是說當我們想要把C程式移植到不同的硬體時, 必須要重新Compile,以產生新的執行檔。

除了需要重新編譯外,新系統是否具備應用程式所需的程式庫,include的檔案是否相容,
也是程式能否在新機器上順利編譯和執行的條件之一。

在實務上,為了讓C程式能在不同的UNIX版本上都能順利編譯,
原作者往往必須使用前置處理器的#ifdef指令,判斷不同環境的適當寫法。

如果想 把在UNIX上開發的C程式移植到Windows上,則有用到專屬程式庫的部分
(如UNIX的使用者介面可能用到X Window的API,Windows就沒有支援,
必須一台一台灌程式庫才行,很可能還要花錢買),就必須重寫才行。

解決此類問題的方法之一,是定義一種 Virtual Machine(虛擬機器),
讓程式語言編譯時不要翻成實體機器的指令,而是翻成Virtual Machine的目的碼。

Virtual Machine 一般是以軟體來模擬的,只要新的平台有 Virtual Machine,
則原始程式不用Compile, 執行舊機器上已有的Virtual Machine目的碼,就可以了。

當然要達到完全不用重新Compile就能執行的理想,還要配合標準的程式庫才行。
Java語言基於上述理念,定義了Java Virtual Machine,它所用的指令稱為 byte code

使用Virtual Machine的缺點之一, 是執行的速度較慢, 代價是開發的速度變快了。
以現在的硬體來說,大部分應用程式的執行速度已經沒有那麼重要,反倒是軟體的開發
速度和品質越來越值得重視。

此外JVM的技術不斷進步, 諸如Just In Time(JIT) Compiler, 或HotSpot等技術都可以讓Java程式以非常接近原生碼(Native Code)的速度執行。因此不要因為某些偏頗的報告或直覺, 就不使用Java了。

後半部中間有點難懂
http://programming.im.ncnu.edu.tw/J_index.html
有突 加再一起看比較好懂
http://openhome.cc/Gossip/JavaEssence/WhyJVM.html



-------------------------------------------------------------------------------------------------------

1. 點選 jbe 檔案



就會執行一個 cmd 檔
cmd 檔會跑這些指令

C:\Users\haha\Desktop\watermark\BCEL\jbe>cd bin

C:\Users\haha\Desktop\watermark\BCEL\jbe\bin>java ee.ioc.cs.jbe.browser.BrowserApplication


之後會跳出一個 window 視窗



2. 按左上角的 open a class file 選擇你要的 class 檔案





現在選的是 helloWord.class 檔, 是 class 檔歐!

測試的時候我用了一個 java 檔,

Hellow.java

main(){
}

再把 Hellow.java 經過 javac 編譯成 java.class.


4. 點選 open 後, 就會跳出另一個視窗.

 


把裡面選項點開


除了記載 Class name, Name and type
就是 Length of byte array, Length of string and string



如果點選 Method - <int> - [0] Code
就可以顯示 Bytecode



點選 Delete constant 的同時, cmd 檔也是跟著執行的, 但是
還是出現一堆例外出來....

[warning] major version should be between 45 and 49 for JDK <= 1.5
org.gjt.jclasslib.structures.InvalidByteCodeException: constant pool entry at 1 is not assignable to org.gjt.jclasslib.structures.constants.ConstantUtf8Info
        at org.gjt.jclasslib.structures.ClassFile.getConstantPoolEntry(ClassFile.java:373)
        at org.gjt.jclasslib.structures.ClassFile.getConstantPoolUtf8Entry(ClassFile.java:323)
        at org.gjt.jclasslib.structures.AttributeInfo.createOrSkip(AttributeInfo.java:59)
        at org.gjt.jclasslib.structures.AbstractStructureWithAttributes.readAttributes(AbstractStructureWithAttributes.java:71)
        at org.gjt.jclasslib.structures.ClassMember.read(ClassMember.java:129)
        at org.gjt.jclasslib.structures.MethodInfo.read(MethodInfo.java:42)
        at org.gjt.jclasslib.structures.MethodInfo.create(MethodInfo.java:34)
        at org.gjt.jclasslib.structures.ClassFile.readMethods(ClassFile.java:719)
        at org.gjt.jclasslib.structures.ClassFile.read(ClassFile.java:487)
        at org.gjt.jclasslib.io.ClassFileReader.readFromInputStream(ClassFileReader.java:101)
        at org.gjt.jclasslib.io.ClassFileReader.readFromFile(ClassFileReader.java:81)
        at ee.ioc.cs.jbe.browser.BrowserInternalFrame.readClassFile(BrowserInternalFrame.java:215)
        at ee.ioc.cs.jbe.browser.BrowserInternalFrame.reload(BrowserInternalFrame.java:171)
        at ee.ioc.cs.jbe.browser.BrowserMDIFrame.doReload(BrowserMDIFrame.java:789)
        at ee.ioc.cs.jbe.browser.detail.FixedListDetailPane.actionPerformed(FixedListDetailPane.java:245)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
        at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at javax.swing.JComponent.processMouseEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$500(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)

看第一段
[warning] major version should be between 45 and 49 for JDK <= 1.5
應該是版本誤差

-------------------------------------------------------------------------------------------------------------------

查一下 stackoverflow 的 Q&A

http://stackoverflow.com/questions/21695950/is-it-possible-to-generate-with-java-8-and-install4j-5-1-5-a-warning-free-instal

Is it possible to generate with Java 8 and Install4j 5.1.5 a warning free installation file

Its because the code you are using was compiled against versions lower than Java 8.
J2SE 8 = 52,
J2SE 7 = 51,
J2SE 6.0 = 50,
J2SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45
居然說我的版本比較低 哎呀呀

底下也有人說
It is because install4j doesn't support java 8 but it does works anyway.
不支援 java 8

-------------------------------------------------------------------------------------------------------------------

如果把 helloWord.java內容加點東西

helloWord.java
public class helloWord{
    public static void main(String args[]){
        int a = 10;
        int b ;
        b = 10;
       
        System.out.println(b);
    }
}




也是可以到 Constant Pool 的內選單多了很多東西,

自己猜測, 有了 System.out.println 的關係, 所以多了一些 PrintStream 有關係吧.
但是 Methods - <int > - [0] Code 卻沒改變

但是比對一下 Method - main - [0] code 就可以看出差別了



上面的部分是只有 main()

下面則是多了一些參數




1 則留言:

  1. 所以我想知道你是如何解决的这个问题 [warning] major version should be between 45 and 49 for JDK <= 1.5

    回覆刪除