Tip Jawa 131: Buat pernyataan dengan javac!

Seringkali Anda mungkin ingin menguji satu bagian kode. Misalnya, Anda lupa bagaimana %operator bekerja dengan angka negatif, atau Anda harus menentukan bagaimana panggilan API tertentu beroperasi. Menulis, menyusun, dan menjalankan program kecil berulang kali hanya untuk menguji hal-hal kecil dapat mengganggu.

Dengan mengingat hal itu, di Tip Java ini , saya menyajikan program singkat yang mengkompilasi dan menjalankan pernyataan kode Java hanya dengan menggunakan alat yang disertakan dalam Sun's JDK 1.2 dan yang lebih baru.

Catatan: Anda dapat mengunduh kode sumber artikel ini dari Sumber.

Gunakan javac di dalam program Anda

Anda akan menemukan javackompiler di tools.jarperpustakaan yang ditemukan di lib/direktori JDK 1.2 dan instalasi yang lebih tinggi.

Banyak pengembang tidak menyadari bahwa aplikasi dapat mengakses secara javacterprogram. Kelas yang disebut com.sun.tools.javac.Mainbertindak sebagai titik masuk utama. Jika Anda mengetahui cara menggunakan javacpada baris perintah, Anda telah mengetahui cara menggunakan kelas ini: compile()metodenya menggunakan argumen masukan baris perintah yang sudah dikenal.

Kumpulkan satu pernyataan

Untuk javacmengkompilasi pernyataan apa pun, pernyataan itu harus dimuat dalam kelas yang lengkap. Mari tentukan kelas minimal sekarang:

 / ** * Sumber dibuat pada * / public class {public static void main (String [] args) memunculkan Exception {}} 

Dapatkah Anda mengetahui mengapa main()metode tersebut harus mengeluarkan pengecualian?

Pernyataan Anda jelas masuk ke dalam main()metode, seperti yang ditunjukkan, tetapi apa yang harus Anda tulis untuk nama kelas? Nama kelas harus memiliki nama yang sama dengan file di dalamnya karena kita mendeklarasikannya sebagai public.

Siapkan file untuk kompilasi

Dua fasilitas termasuk dalam java.io.Filekelas karena JDK 1.2 akan membantu. Fasilitas pertama, membuat file sementara, membebaskan kita dari memilih beberapa nama sementara untuk file dan kelas sumber kita. Ini juga menjamin keunikan nama file. Untuk melakukan tugas ini, gunakan createTempFile()metode statis .

Fasilitas kedua, secara otomatis menghapus file saat VM keluar, memungkinkan Anda menghindari kekacauan direktori atau direktori dengan program uji kecil sementara. Anda menyetel file untuk dihapus dengan menelepon deleteOnExit().

Buat file

Pilih createTempFile()versi yang dapat Anda gunakan untuk menentukan lokasi file baru, daripada mengandalkan beberapa direktori sementara default.

Terakhir, tentukan ekstensi harus .javadan awalan file harus jav(pilihan awalan sewenang-wenang):

File file = File.createTempFile ("jav", ".java", File baru (System.getProperty ("user.dir"))); // Setel file yang akan dihapus pada file keluar.deleteOnExit (); // Dapatkan nama file dan ekstrak nama kelas darinya String filename = file.getName (); String classname = filename.substring (0, filename.length () - 5);

Perhatikan bahwa Anda mengekstrak nama kelas dengan menghapus .javasufiks.

Keluarkan sumber dengan segmen kode pendek Anda

Selanjutnya, tulis kode sumber ke file melalui a PrintWriteruntuk kenyamanan:

PrintWriter out = new PrintWriter (new FileOutputStream (file)); out.println ("/ **"); out.println ("* Sumber dibuat pada" + Tanggal baru ()); out.println ("* /"); out.println ("kelas publik" + nama kelas + "{"); out.println ("public static void main (String [] args) throws Exception {"); // Segmen kode pendek Anda out.print (""); out.println (text.getText ()); out.println ("}"); out.println ("}"); // Flush dan tutup aliran keluar.flush (); out.close ();

Kode sumber yang dihasilkan akan terlihat bagus untuk pemeriksaan nanti, dengan manfaat tambahan bahwa jika VM keluar secara tidak normal tanpa menghapus file sementara, file tersebut tidak akan menjadi misteri jika Anda menemukannya nanti.

Segmen kode pendek, jika Anda perhatikan, ditulis dengan text.getText(). Seperti yang akan Anda lihat segera, program ini menggunakan GUI kecil (antarmuka pengguna grafis), dan semua kode Anda akan diketik ke dalam TextAreayang disebut text.

Gunakan javac untuk mengkompilasi

Untuk menggunakan compiler, buat Maininstance objek, seperti yang disebutkan di atas. Mari kita gunakan bidang contoh untuk menampung ini:

 pribadi com.sun.tools.javac.Main javac = new com.sun.tools.javac.Main (); 

Panggilan ke compile()dengan beberapa argumen baris perintah akan mengkompilasi file yang disebutkan di atas. Ia juga mengembalikan kode status yang menunjukkan sukses atau masalah dengan kompilasi:

String [] args = String baru [] {"-d", System.getProperty ("user.dir"), nama file}; int status = javac.compile (args);

Jalankan program yang baru dikompilasi

Refleksi menjalankan kode dengan baik di dalam kelas arbitrer, jadi kami akan menggunakannya untuk mencari dan mengeksekusi main()metode tempat kami menempatkan segmen kode pendek kami. Selain itu, kami memproses kode status yang dikembalikan dengan menampilkan pesan yang sesuai untuk memberikan pengalaman yang bersih dan informatif kepada pengguna. Kami menemukan arti setiap kode status dengan mendekompilasi javac, maka kami memiliki pesan "Status kompilasi" yang aneh.

File kelas sebenarnya akan berada di direktori kerja pengguna saat ini, seperti yang telah ditentukan dengan -dopsi ke javacinstance.

Sebuah 0kode status menunjukkan bahwa kompilasi berhasil:

switch (status) {case 0: // OK // Jadikan file kelas sementara juga File baru (file.getParent (), classname + ".class"). deleteOnExit (); coba {// Cobalah untuk mengakses kelas dan jalankan metode utamanya Class clazz = Class.forName (classname); Metode main = clazz.getMethod ("main", Kelas baru [] {String []. Class}); main.invoke (null, Objek baru [] {String baru [0]}); } catch (InvocationTargetException ex) {// Exception dalam metode utama kami baru saja mencoba menjalankan showMsg ("Exception in main:" + ex.getTargetException ()); mis. getTargetException (). printStackTrace (); } catch (Exception ex) {showMsg (ex.toString ()); } istirahat; kasus 1: showMsg ("Status kompilasi: ERROR"); istirahat; kasus 2: showMsg ("Status kompilasi: CMDERR"); istirahat; kasus 3: showMsg ("Status kompilasi: SYSERR"); istirahat; kasus 4: showMsg ("Status kompilasi:ABNORMAL "); break; default: showMsg (" Compile status: Unknown exit status ");}

Sebuah InvocationTargetExceptionlemparan ketika kode dieksekusi melalui refleksi dan kode itu sendiri memunculkan beberapa pengecualian. Jika itu terjadi, InvocationTargetExceptionakan ditangkap dan jejak tumpukan pengecualian yang mendasarinya akan dicetak ke konsol. Semua pesan penting lainnya dikirim ke showMsg()metode yang hanya menyampaikan teks ke System.err.

Kode status non-OK (kode selain nol) menyebabkan pesan kesalahan singkat ditampilkan untuk memberi tahu pengguna apa yang terjadi jika hasil kompilasi masalah.

Cara menggunakan program ini

Ya, itu dia! Selain antarmuka pengguna yang bagus dan nama yang menarik, inti program sudah lengkap. Program ini, menampilkan antarmuka AWT (Abstract Windowing Toolkit) kecil untuk input, mengirimkan semua output ke System.errkonsol (atau ke mana pun Anda memutuskan untuk mengirimkannya dengan mengubah showMsg()metode).

Jadi, bagaimana dengan nama program yang menarik? Bagaimana dengan JavaStatement? Ini ringkas, langsung ke intinya, dan sangat membosankan sehingga tidak ada yang akan mengira itu dipilih dengan cara ini dengan sengaja. Untuk selanjutnya, semua referensi ke "program" atau "aplikasi" akan diganti dengan "JavaStatement."

Tulis pernyataan

Pernyataan terkadang harus ditulis dengan cara tertentu, dan Anda harus sangat berhati-hati untuk menjalankan JVM dengan jalur kelas yang tepat. Saya menguraikan masalah ini di bawah:

  • Jika Anda menggunakan paket selain java.lang, Anda mungkin melihat tidak adanya importpernyataan di bagian atas kode sumber yang dihasilkan. Anda mungkin ingin menambahkan beberapa impor praktis seperti java.ioatau java.utiluntuk menyimpan beberapa pengetikan.
  • If you do not add any imports, then for any class outside java.lang, you must prepend the full package name. For example, to create a new java.util.StringTokenizer, use new java.util.StringTokenizer(...) instead of just new StringTokenizer(...).

Screenshot

The figure below shows JavaStatement's GUI, with its text area for typing statements and a Run button for executing the code. All output goes to System.err, so watch the window from where the program runs.

Run the program

JavaStatement references two classes that may not otherwise be included in the JVM's classpath: the com.sun.tools.javac.Main class from tools.jar and the temporary compiled classes situated in the current working directory.

Thus, to run the program properly, use a command line such as:

 java -cp /lib/tools.jar;. JavaStatement 

where represents your JDK's installed location.

For example, I installed my JDK to C:\Java\jdk1.3.1_03. Hence, my command line would be:

 java -cp C:\java\jdk1.3.1_03\lib\tools.jar;. JavaStatement 

Note: You must also include the tools.jar library in the classpath when compiling JavaStatement.java.

If you forget to add the tools.jar file to your classpath, you'll find complaints either about a NoClassDefFoundError for the JVM or an unresolved symbol for the compiler.

Finally, compile the JavaStatement.java with the same compiler version that runs the code.

Test short bits of code? No problem!

Java developers frequently test short bits of code. JavaStatement lets you efficiently test such code by freeing you from tediously going through the cycle of writing, compiling, and running many small programs.

Beyond JavaStatement, perhaps challenge yourself by exploring how to use javac in your own programs. Off the top of my head, I can think of two javac uses:

  1. A rudimentary form of scripting: Coupled with using your own classloader, you could make the compiled classes reference objects from within a running program
  2. A programming language translator: It is simpler to translate a program (say written in Pascal) into Java, and compile it into classfiles, than to compile it yourself

Remember, javac does the hard work of translating a high-level language into low-level instructions—freeing you to do your own thing with Java!

Shawn Silverman adalah mahasiswa pascasarjana di Departemen Teknik Elektro dan Komputer di Universitas Manitoba, Kanada. Dia mulai bekerja dengan Java pada pertengahan tahun 1996 dan telah menggunakannya hampir secara eksklusif sejak saat itu. Minatnya saat ini termasuk simulasi medan listrik dan fluida, Java tertanam, dan implementasi trik GUI yang bagus. Shawn juga mengajar mata kuliah desain perangkat lunak tahun ketiga di departemen teknik komputer di universitasnya.

Pelajari lebih lanjut tentang topik ini

  • Untuk mengunduh program artikel ini, buka

    //images.techhive.com/downloads/idge/imported/article/jvw/2002/08/jw-javatip131.zip

  • Untuk informasi lebih lanjut tentang kompiler javac, baca halaman "javac — The Java Compiler"

    //java.sun.com/products/jdk/1.1/docs/tooldocs/solaris/javac.html

  • "The Reflection API" trail by Dale Green in Sun Microsystems' Java Tutorial (Sun Microsystems, 2002)

    //java.sun.com/docs/books/tutorial/reflect/index.html

  • The Javadoc for java.lang.reflect

    //java.sun.com/j2se/1.3/docs/api/java/lang/reflect/package-summary.html

  • Read "A Java Make Tool for the Java Language" (the tool uses javac as we have in this article)

    //www.experimentalstuff.com/Technologies/JavaMake/index.html

  • Browse the Development Tools section of JavaWorld's Topical Index

    //www.javaworld.com/channel_content/jw-tools-index.shtml

  • View all previous Java Tips and submit your own

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Learn Java from the ground up in JavaWorld's Java 101 column

    //www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html

  • Java experts answer your toughest Java questions in JavaWorld's Java Q&A column

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • Stay on top of our Tips 'N Tricks by subscribing to JavaWorld's free weekly email newsletters

    //www.javaworld.com/subscribe

  • Learn the basics of client-side Java in JavaWorld's Java Beginner discussion. Core topics include the Java language, the Java Virtual Machine, APIs, and development tools

    //forums.idg.net/[email protected]@.ee6b804

  • Anda akan menemukan banyak artikel terkait TI dari publikasi saudara kita di .net

Cerita ini, "Tip Jawa 131: Buat pernyataan dengan javac!" awalnya diterbitkan oleh JavaWorld.