forked from jruby/jruby
-
Notifications
You must be signed in to change notification settings - Fork 0
JRuby Reference
banshee edited this page Sep 21, 2011
·
12 revisions
- require 'path/to/file.jar'
- require can take a path to a jar file. It searches the JRuby $LOAD_PATH for the file.
- require 'java'
- A special `require 'java'` directive in your file will give you access to any bundled Java libraries (classes within your java class path). However, this will not give you access to any non-bundled libraries.
- #each
- JRuby supports calling the `#each` method on Enumerable objects
- Name translations
- Java: org.foo.department.Widget
For the top-level Java packages java, javax, org, and com you can type in a fully qualified class name:
java_import java.lang.SystemYou can use your own top-level package names by adding a def:
def edu
Java::Edu
end
java_import edu.example.MyClass- Importing a package into a class or module
module M
include_package "org.xxx.yyy"
# now any class within "org.xxx.yyy" will be available within
# this module, ex if "org.xxx.yyy.MyClass" exists
# a = MyClass.new
end- enums
- Available as constants:
ms_constant_value = java.util.concurrent.TimeUnit::MILLISECONDS- Alternative Names and Beans Convention
java.lang.System.currentTimeMillis
java.lang.System.current_time_millisJRuby also translates methods following the 'beans-convention':
x.getSomething becomes x.something
x.setSomething(newValue) becomes x.something = new_value
x.isSomething becomes x.something?- Constructors
# Get the the three-integer constructor for this class
construct = JavaClass.java_class.constructor(Java::int, Java::int, Java::int)
# Use the constructor
object = cons.new_instance(0xa4, 0x00, 0x00)- java_class
- returns the Java class of an object. Use this for methods expecting a java Class object:
DoSomethingWithJavaClass(MyJavaClass.java_class)- java_kind_of?
- works like the `instanceof` operator.
- java_object
- returns the underlying Java object. This is useful for reflection.
- java_send
- overrides JRuby's dispatch rules and forces the execution of a named Java method on a Java object. This is useful for Java methods, such as `initialize`, with names that conflict with built-in Ruby methods.
# get a bound Method based on the add(int, Object) method from ArrayList
add = list.java_method :add, [Java::int, java.lang.Object]
add.call(0, 'foo')Similarly, an Unbound method object can be retrieved:
# get an UnboundMethod from the ArrayList class:
toString = ArrayList.java_method :toString
toString.bind(list).call # => [foo, foo]- java_method
- retrieves a bound or unbound handle for a Java method to avoid the reflection inherent in `java_send`.
- declared_method
@mgr = javax.media.rtp.RTPManager.newInstance
localhost = java.net.InetAddress.getByName("127.0.0.1")
localaddr = javax.media.rtp.SessionAddress.new(localhost, 21000, localhost, 21001)
method = @mgr.java_class.declared_method(:initialize, javax.media.rtp.SessionAddress )
method.invoke @mgr.java_object, localaddr.java_object- Type conversion
- Arrays
- constructs a Java array from a Ruby array:
[1,2,3].to_java
=> [Ljava.lang.Object;@1a32ea4By default, `to_java` constructs `Object` arrays. You can specify the parameter with an additional argument which can either be a symbol or a primitive class like `Java::double`
["a","b","c"].to_java(:string)
=> [Ljava.lang.String;@170984c
[1, 2, 3.5].to_java Java::double
=> [D@9bc984- Constructing Empty Java Arrays
- Use the `[]` method of the primitive types in the Java module:
bytes = Java::byte[1024].new # Equivalent to Java's bytes = new byte[1024];- Ruby String to Java Bytes and back again
bytes = 'a string'.to_java_bytes
=> #<#<Class:01x9fcffd>:0x40e825 @java_object=[B@3d476c>
string = String.from_java_bytes bytes
=> "a string"- Java InputStream to a ruby IO object
io = input_stream.to_io # works for InputStreams, OutputStreams, and NIO Channels- Interfaces
class SomeJRubyObject
include java.lang.Runnable
include java.lang.Comparable
endWhen calling a method that expects an interface, JRuby checks if a block is passed and automatically converts the block to an object implementing the interface.
- Exceptions
begin
java.lang.Integer.parse_int("asdf")
rescue java.lang.NumberFormatException => e
puts "Failed to parse integer: #{e.message}"
end begin
raise java.lang.IllegalArgumentException.new("Bad param")
rescue java.lang.IllegalArgumentException => e
puts "Illegal argument: #{e}"
endOr
begin
raise Java::JavaLang::IllegalArgumentException.new("Bad param")
rescue Java::JavaLang::IllegalArgumentException => e
puts "Illegal argument: #{e}"
end- synchronize
- a synchronize method is provided on every wrapped Java object. For example:
synchronized(obj) {
obj.wait(1000);
}is implement like this in Ruby:
obj.synchronized do
obj.wait 1000
end- java_require
- Normally, jrubyc --java(c) will include the complete source of your script in the compiled class, but often you may want to keep the source on disk or generate multiple classes that all come from the same file. To do this, add a java_require line (plus a require 'java' line to enable Java support in the Ruby code) that specifies what filename to load. The filename specified is loaded using normal Ruby 'require' semantics.
require 'java'
java_require 'my_foo'
class Foo
def bar(a,b)
puts a + b
end
end- java_signature
require 'java'
java_require 'my_foo'
class Foo
java_signature 'void bar(int, int)'
def bar(a,b)
puts a + b
end
end- java_package
require 'java'
java_require 'my_foo'
java_package 'com.example'
class Foo; end