Apakah ada sesuatu seperti mode REPL interaktif python, tetapi untuk Java?

92

Apakah ada sesuatu seperti mode REPL interaktif python, tetapi untuk Java? Sehingga saya bisa, misalnya, mengetik InetAddress.getAllByName( localHostName )di jendela, dan segera mendapatkan hasil, tanpa semua hal mimpi buruk () public static void ini?

Yoni Roit
sumber
3
Java memperkenalkannya di JDK-9 : JEP 222: jshell: Java Shell
Bukan bug

Jawaban:

64

edit Sejak Java 9 ada JShell

Berikut jawaban asli

Anda juga bisa menggunakan Groovy Console . Ini adalah konsol interaktif tempat Anda dapat melakukan apa yang Anda inginkan. Karena Groovy juga menyertakan kelas dari platform java inti, Anda juga dapat menggunakan kelas tersebut.

Ini terlihat seperti ini:

Tangkapan layar dari Groovy

OscarRyz
sumber
Tangkapan layar tidak lagi ada di imageshack.
Hal yang sangat menyenangkan tentang konsol groovy adalah lebih banyak paket yang diimpor secara default (mis. Java.util. *), Jadi Anda tidak perlu menulis begitu banyak pernyataan impor
Dónal
2
Bagi mereka yang malas menginstal Groovy, tersedia konsol versi online ini di sini: groovyconsole.appspot.com . Beberapa JDK lib tidak tersedia (misalnya I / O dan System.exit()) tetapi untuk sebagian besar tujuan itu harus memadai.
Dónal
Ini tidak menerima kelas apakah itu normal? class test{public static void test(){System.out.println('test')}}
Kapur
52

Eclipse memiliki fitur untuk melakukan ini, meskipun ini bukan perulangan. Ini disebut "Halaman Scrapbook". Saya berasumsi analoginya adalah Anda memiliki lembar memo tempat Anda mengumpulkan potongan-potongan kecil kode.

Bagaimanapun, untuk membuatnya bekerja, buka proyek di Eclipse (Halaman Scrapbook Anda akan dikaitkan dengan proyek - Eclipse suka jika proyek memiliki barang).

Kemudian:

  1. Di jendela navigator proyek, pilih folder yang ada di suatu tempat di proyek Anda.
  2. Pilih menu File -> New -> Other, atau tekan Control-N.
  3. Pilih Java -> Java Run / Debug -> Halaman Scrapbook.
  4. Tekan "Next", lalu beri nama file, lalu tekan "Finish".

Sekarang Anda memiliki halaman lembar memo. Ketikkan beberapa kode, mungkin seperti ini:

System.out.println(System.getProperties());

Kemudian pilih teks dengan mouse, dan tekan Control-U atau pilih "Execute" dari menu konteks. Kode akan berjalan dan hasilnya akan muncul di konsol.

Anda juga dapat mengetik ekspresi, memilihnya, dan memilih Tampilan dari menu konteks. Ini akan mengevaluasi ekspresi dan mencetak tipenya. Misalnya, menjalankan Display on 1 + 2akan mencetak (int) 3.


sumber
1
Terima kasih untuk itu. Beanshell sudah menentukan waktunya untuk saya, tapi ini bekerja dengan sempurna.
Bayard Randel
3
Saya telah menggunakan Eclipse begitu lama tetapi tidak tahu tentang ini, terima kasih!
Tobold
28

BeanShell adalah penerjemah sumber Java yang kecil, gratis, dan dapat disematkan dengan fitur bahasa skrip objek, yang ditulis dalam Java. BeanShell secara dinamis mengeksekusi sintaks Java standar dan memperluasnya dengan kemudahan pembuatan skrip umum seperti tipe lepas, perintah, dan penutupan metode seperti yang ada di Perl dan JavaScript. Anda dapat menggunakan BeanShell secara interaktif untuk eksperimentasi dan debugging Java serta untuk memperluas aplikasi Anda dengan cara baru. Scripting Java cocok untuk berbagai macam aplikasi termasuk pembuatan prototipe cepat, ekstensi skrip pengguna, mesin aturan, konfigurasi, pengujian, penerapan dinamis, sistem tertanam, dan bahkan pendidikan Java.

http://www.beanshell.org/

http://www.beanshell.org/manual/syntax.html#Standard_Java_Syntax

bakkal
sumber
Ada juga shell interaktif Jython dan JRuby untuk sintaks yang lebih sedikit.
bakkal
1
BeanShell secara aktif dipertahankan sebagai beanshell 2 - code.google.com/p/beanshell2
hshib
Contoh sederhana menjalankan kulit kacang dari baris perintah dapat ditemukan di sini
Brad Parks
@hshib: Sekarang di Github dan komit terakhir adalah dari 2013. Itu tidak "dipertahankan secara aktif".
Martin Schröder
@ MartinSchröder, komentar itu WS pada 2013 :-)
hshib
19

Anda dapat menggunakan halaman Eclipse Scrapbook.

Di Eclipse buat halaman Scrapbook. Dalam proyek Anda, New-> Other-> halaman Scrapbook.

Di dalam file, masukkan beberapa teks, pilih dan tekan ctrl-U, dan begitulah.

Untuk mengelola impor Anda, klik kanan di halaman dan pilih Setel Impor, di mana Anda dapat memilih untuk mengimpor paket atau satu kelas. Ini gigih, dan disimpan dengan halaman.

Matthew Farwell
sumber
3
Meskipun berguna, halaman lembar memo bukanlah sesi yang terus-menerus, jadi tidak berfungsi dengan baik sebagai REPL.
MHarris
19

Pertanyaan lama, tetapi sekarang ada jawaban yang lebih baik (Mei 2013) - java-REPL! Ini tersedia di github dan juga tersedia langsung di situs web java-repl untuk pengujian cepat satu kali.

Jika Anda mengambil kode hub git dan menjalankan antuntuk menghasilkan artefak, Anda dapat membuatnya mudah digunakan dengan skrip kecil seperti:

#!/bin/sh
java -jar /home/rdahlgren/scripts/javarepl-dev.build.jar

Sejak menemukan proyek ini saya mungkin menggunakannya 5 kali sehari. Nikmati!

Ron Dahlgren
sumber
Tautan untuk repl online sekarang tampaknya javarepl.com/term.html tautan lama hanya menunjukkan kesalahan Java.
Tony
13

Sepertinya belum ada yang menyebutkan bahwa Java (6, 7) mengirimkan konsol REPL yang disebut jrunscript. Ini adalah bahasa agnostik (sehingga dapat digunakan dengan Jython, JRuby dll.). Ini default ke JavaScript (Rhino) yang juga dibundel secara default, dan seperti bahasa lain Anda dapat mengakses semua paket / objek yang tersedia di classpath.

pengguna268396
sumber
11

Sebagai alternatif dari Groovy, cobalah Beanshell: http://www.beanshell.org/

Ini lebih mirip Java dan memungkinkan Anda untuk menggunakan sintaks Java secara langsung.

Tim Jansen
sumber
apakah kulit kacang dipertahankan lagi?
rogerdpack
1
BeanShell secara aktif dipertahankan sebagai beanshell 2 - code.google.com/p/beanshell2
hshib
@hshib: Tidak. Komitmen terakhir di github adalah dari 2013.
Martin Schröder
11

Jython adalah implementasi python yang memungkinkan Anda memeriksa dan berinteraksi dengan objek Java.

>>> from java.net import *
>>> InetAddress.getAllByName("google.com")
array(java.net.InetAddress,[google.com/209.85.171.100, 
                            google.com/74.125.45.100,
                            google.com/74.125.67.100])
bodoh
sumber
8

Clojure menyediakan REPL yang bisa Anda gunakan.

Ande Turner
sumber
7

The asyik konsol memungkinkan Anda untuk melakukan itu. Sebenarnya ini dimaksudkan untuk mencoba dan menguji kode keren, tetapi karena groovy adalah superset dari Java, ini memungkinkan hal-hal Java yang biasa juga.

Saya baru saja memasukkan ini ke konsol:

InetAddress.getAllByName('localhost')

dan tekan CTRL-R, lalu kembali:

groovy> InetAddress.getAllByName('localhost')

Result: [localhost/127.0.0.1]
Ole
sumber
7

Scala juga menawarkan konsol interaktif. Saya bisa menggunakannya untuk mendapatkan hasil ekspresi dalam pertanyaan Anda dengan InetAddress yang sepenuhnya memenuhi syarat, seperti di:

java.net.InetAddress.getAllByName("localhost")
joel.neely
sumber
6

Sementara JRuby , BeanShell , Julian Fleischer's REPL ada di sana, REPL Albert Latacz tampaknya menjadi yang terbaru dan aktif.

Mencoba dengan definisi kelas sederhana, berfungsi dengan baik.

$ java -jar javarepl.jar
Welcome to JavaREPL version 56 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_17)
Type in expression to evaluate.
Type :help for more options.

java> public class Test {
    | public static void execute(String [] s) {
    |  System.out.println(54353 + s[0]);
    | }}

java> Test.execute(new String [] {"234343"});
54353234343

java> System.exit(0);
sandeepkunkunuru
sumber
3

Untuk orang-orang yang memiliki akses ke Mathematica, JLink memungkinkan Anda mengakses Java dan skrip dengan kode Mathematica:

Needs["JLink`"]
LoadJavaClass["java.net.InetAddress"]
InetAddress`getAllByName["localhost"]

Tekan Shift-Enter untuk mengevaluasi, dan Anda mendapatkan

{<<JavaObject[java.net.Inet4Address>>}

Kemudian Anda dapat menggunakan fungsi Peta Mathematica untuk memanggil toStringobjek yang dikembalikan:

#@toString[]& /@ %

untuk mendapatkan hasil (atau menggunakan sintaks yang kurang jelas, Map[Function[obj, obj@toString[]], %]):

{"localhost/127.0.0.1"}

Jika Anda mulai serius dengan ini, Anda pasti ingin membaca tutorial Todd Gayley di http://reference.wolfram.com/mathematica/JLink/tutorial/Overview.html .

jfklein.dll
sumber
2

Jika Anda sudah mengetahui Groovy (yang saya anggap sudah Anda ketahui, karena Anda menyebutkan Groovy Console), maka gunakan saja groovysh atau groovyConsole, yang termasuk dalam distro Groovy. Jika Anda memiliki jars kustom yang ingin diimpor, Anda dapat menulis file batch yang memulai groovysh / groovyConsole dengan yang ditambahkan ke classpath. Anda juga bisa melakukan ini

this.class.classLoader.rootLoader.addURL(new URL("file:///path to file"))

dari dalam cangkang untuk memuat toples lain.

Saya dulu menggunakan Jython beberapa tahun lalu untuk melakukan apa yang Anda minta. Sebagai bagian dari skrip build saya, saya membuat file jython.bat dan .py kustom yang menyertakan classpath lengkap untuk proyek yang sedang saya kerjakan. Dengan cara itu ketika saya memulai Jython, semua kodenya akan tersedia, dan Spring akan membiarkan saya memutarbalikkan hal-hal di sistem langsung. Anda dapat melakukan hal yang sama dengan Groovy, JRuby, BeanShell, dll.

Joey Gibson
sumber
Saya tahu saya bisa menggunakan shell groovy, tetapi Groovy tidak memiliki semantik yang persis sama dengan Java, dan tidak memiliki pemeriksaan tipe. Jadi mungkin saja saya bisa mendapatkan kesalahan kompilasi, atau perilaku runtime yang berbeda dengan potongan kode Java yang tampaknya berfungsi di shell Groovy.
Dónal
groovy juga akan memuat semua lib di ~ / .groovy / lib, Anda dapat menyalin barang di sana atau menggunakan symlink
Jason
1

Kebanyakan IDE memiliki jendela yang disebut "mode langsung" yang memungkinkan Anda mengevaluasi kode java dengan cepat.

krosenvold.dll
sumber
Eclipse memiliki tampilan "display" yang mendekati apa yang saya inginkan. Masalahnya, ini harus dalam konteks menjalankan aplikasi. Saya harus menjalankan aplikasi, berhenti di breakpoint, dan baru kemudian saya bisa mengetik apa yang saya inginkan.
Yoni Roit
@YoniRoit IMHO Saya suka "tampilan" + mode debug lebih baik dari baris perintah REPL. Saya dulu menggunakan REPL w / Python sejak lama jadi saya telah melakukan keduanya. Saya pikir jauh lebih baik untuk menulis Tes Unit dan menempatkan titik istirahat dan bermain dengan konteks yang diinginkan sambil menempelkan kode apa pun yang berfungsi kembali ke pengujian unit. Mendapatkan konteks yang tepat dalam REPL biasa jauh lebih sulit daripada mengatakan Uji Unit.
Adam Gent
1

Anda dapat melihat BlueJ yang merupakan lingkungan pengembangan Java interaktif yang dimaksudkan untuk mengajarkan OOP daripada sebagai IDE lengkap seperti Eclipse atau NetBeans. Ini menyenangkan untuk diajak bermain-main.

Anda dapat melihatnya beraksi di YouTube dalam serangkaian tutorial Java.

Trevor Tippins
sumber
ini menarik. Bluej seperti op repl. Tidak terlalu berguna untuk hal-hal yang saat ini Anda gunakan repl untuk tetapi Anda mungkin menggunakannya untuk membuat prototipe desain oo Anda karena Anda akan menggunakan repl untuk membuat prototipe metode.
Bill K
1

DrJava adalah IDE pendidikan yang menyertakan panel REPL.

Ada plugin Eclipse juga, tetapi tidak berhasil untuk saya. Saya pikir itu belum diperbarui dalam beberapa saat. Jadi yang biasanya saya lakukan adalah membuat jendela DrJava terbuka untuk pertanyaan "apa yang terjadi jika saya melakukan ini".

EclipseShell mungkin bagus juga, tapi saya belum menggunakannya.

johncip
sumber
1

Beanshell 2

harishtella
sumber
Tidak terawat.
Martin Schröder
1

Ada IDE sederhana bernama DrJava yang memiliki konsol Interaksi. Ini bekerja persis seperti yang saya harapkan. Cukup muat file dan mulailah berinteraksi dengan objek di dalamnya.

dansalmo
sumber
1

JPad adalah java scratchpad dengan REPL bawaan:

C:\>jpad
       _ _____          _
      | |  __ \        | |
      | | |__) |_ _  __| |
  _   | |  ___/ _` |/ _` |
 | |__| | |  | (_| | (_| |
  \____/|_|   \__,_|\__,_|



Anything you type is evaluated as java.
The code is continuously appended until you call \clear.
Other Available Commands:
\exit - exit
\clear (n) - clear past java statements
\history - display all past java statements
\help - display this help

j>2+2
4
j>Math.sin(100.1)
-0.4177477
j>

Ini juga pintar tentang membuang koleksi, daftar, peta, dll dan memungkinkan merendernya sebagai tabel atau bagan:

masukkan deskripsi gambar di sini

Ryan Hamilton
sumber
1

Java 9 menyediakan JShell.

jshell> println( "Print me!")
jshell> Print me!
Neha Gangwar
sumber
0

Jython, JIRB untuk JRuby, Groovy (groovyconsole et al) dan Beanshell adalah pilihan yang layak.

Saya telah menggunakan InteractiveConsoleuntuk Jython, itu benar-benar bekerja dengan baik di aplikasi.

gpampara
sumber