1 {-# LANGUAGE OverloadedStrings, FlexibleContexts #-}
3 import Control.Monad.Exception
4 import qualified Data.ByteString.Lazy as B
13 import qualified Java.Lang
14 import qualified Java.IO
16 test :: (Throws ENotFound e, Throws ENotLoaded e, Throws UnexpectedEndMethod e) => GenerateIO e ()
19 -- Add current directory (with Hello.class) to ClassPath
22 -- Load method signature: Hello.hello() from Hello.class
23 helloJava <- getClassMethod "./Hello" "hello"
25 -- Initializer method. Just calls java.lang.Object.<init>
26 newMethod [ACC_PUBLIC] "<init>" [] ReturnsVoid $ do
30 invokeSpecial Java.Lang.object Java.Lang.objectInit
33 -- Declare hello() method and bind it's signature to hello.
34 hello <- newMethod [ACC_PUBLIC, ACC_STATIC] "hello" [IntType] ReturnsVoid $ do
37 getStaticField Java.Lang.system Java.IO.out
38 loadString "Здравствуй, мир!"
39 invokeVirtual Java.IO.printStream Java.IO.println
40 getStaticField Java.Lang.system Java.IO.out
41 loadString "Argument: %d\n"
43 allocArray Java.Lang.object
47 invokeStatic Java.Lang.integer Java.Lang.valueOfInteger
49 invokeVirtual Java.IO.printStream Java.IO.printf
51 invokeStatic "Hello" helloJava
56 newMethod [ACC_PUBLIC, ACC_STATIC] "main" [arrayOf Java.Lang.stringClass] ReturnsVoid $ do
60 -- Call previously declared method
61 invokeStatic "Test" hello
68 testClass <- generateIO [] "Test" test
69 B.writeFile "Test.class" (encodeClass testClass)