Monkey patching a Java class?

Marc Downie marc at openendedgroup.com
Mon Jul 21 12:47:53 UTC 2014


Got it, thanks. I'd consider adding a sentence to the "Java.extend" docs (
https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions) to that
end.

My outside perspective is that it's unexpected that a) you can't, b) trying
to fails silently, and c) setting arbitrary members on Java.extend classes
work but they simply disappear never to return.

best,

Marc


On Mon, Jul 21, 2014 at 6:07 AM, A. Sundararajan <
sundararajan.athijegannathan at oracle.com> wrote:

> No, you can't add new methods to extended class (no facility to declare
> types and so on) - only overrides of super class methods.
>
> -Sundar
>
>
> On Sunday 20 July 2014 10:28 PM, Marc Downie wrote:
>
>> Does adding new methods to Java.extend based subclasses actually work?
>> Currently I have (staying close to the example code):
>>
>> var ArrayList = Java.type("java.util.ArrayList")
>> var ArrayListExtender = Java.extend(ArrayList)
>> var printSizeInvokedArrayList = new ArrayListExtender() {
>>      size: function() { print("size invoked!"); },
>>    banana: function() { print("Banana"); } // this doesn't override
>> anything
>> in ArrayList
>> }
>>
>> printSizeInvokedArrayList.size() // WORKS
>> printSizeInvokedArrayList.banana() // TYPE ERROR ([] has no such function
>> "banana")
>>
>> // and even:
>>
>> printSizeInvokedArrayList.peach = function(){print("Peach");} // no
>> error,
>> but....
>> printSizeInvokedArrayList.peach() // TYPE ERROR ([] has no such function
>> "peach")
>>
>> (1.9.0-ea-b23 and 1.8.0_20-ea-b23)
>>
>> Marc.
>>
>>
>>
>> On Thu, May 1, 2014 at 11:23 PM, A. Sundararajan <
>> sundararajan.athijegannathan at oracle.com> wrote:
>>
>>  No, you can't add/remove a method (or public field) of a Java class to
>>> use
>>> within the script. You could subclass and expose that subclass as
>>> "java.io.File" by
>>>
>>>      var oldFile = java.io.File;
>>>      java.io.File = Java.extend(oldFile, ...)
>>>
>>> But, I'd not recommend it - besides user can still get original
>>> java.io.File via Java.type (unless you do similar hack on Java.type as
>>> well!!)
>>>
>>> Cleaner approach is to expose a script API wrapping java.io.File.
>>>
>>> -Sundar
>>>
>>>
>>> On Thursday 17 April 2014 12:03 AM, HRJet wrote:
>>>
>>>  Is it possible to monkey patch a Java class for use within Javascript?
>>>>
>>>> For example, I want to add a convenience method to java.io.File class,
>>>> say
>>>> "readAsString()".
>>>>
>>>> Then, in javascript I want to call file.readAsString()  where file is an
>>>> instance of java.io.File. Note that the file instance may be created by
>>>> some third-party code, over which I have no control.
>>>>
>>>> In Java land, this seems to be usually done with CGLib or AspectJ, etc.
>>>>
>>>> I was wondering if nashorn had some trick up its sleeve for doing this
>>>> in
>>>> script land, since this sort of thing is common in Javascript.
>>>>
>>>> thanks,
>>>> HRJ
>>>>
>>>>
>>>
>


More information about the nashorn-dev mailing list