On 13.12.2016 16:56, Alan Bateman wrote:
> On 13/12/2016 15:47, Rony G. Flatscher wrote:
>
>> :
>>
>> So the current code does not take protected members into account. If
>> protected members (cf. Alex'
>> comment) get added, wouldn't e.g. java.lang.reflect.Method.invoke(...) or
>> java.lang.reflect.Field.get(...) be the place to check in the next step,
>> throwing an
>> IllegalAccessException if the object is not instantiated from a subclass of
>> the class the protected
>> method to invoke or protected Field to get is defined?
>>
> If you mean you are asking for setAccessible(true) to succeed but still do
> the access check then
> it will cause a lot of complications.
>
> So I'm curious, are you calling setAccessible on protected members that you
> do have access or not?
> If you do have access (you are in the same package or a sub-type) then you
> don't need to call
> setAccessible. On the other hand, if you are looking to use the
> AccessibleObject to get into a
> different subtype then you are out of luck, the package needs to be open to
> you to do that.
The reason for the question is a language binding (to IBM's Object Rexx in the
open-sourced form
called open Object Rexx, ooRexx, and heavily improved since in the hands of the
Rexx Language
Assocation, www.rexxla.org) to Java that I have created 2000 (yup, quite some
time) using Apache's
Bean scripting framework BSF (rooted in another open-source project at IBM) and
have constantly
improved since then. The ooRexx Java bridge is available for Windows, Linux and
MacOSX.
ooRexx is an interpreted language implemented in C++, the bridge to Java is
realized via JNI and a
Java framework. It allows proxying Java objects with Rexx objects (no strong
typing, caseless, quite
a few Smalltalk concepts, sending ooRexx messages cause the appropriate Java
classes, members to be
looked up, methods to be invoked on behalf of the Rexx program), and proxying
Rexx objects with Java
objects (causing Java method invocations to result in sending appropriate Rexx
messages to the
proxied Rexx objects), including the ability to implement Java interface or
abstract classes in
ooRexx (i.e. implement the abstract methods with ooRexx methods). The fact that
ooRexx is based on
classic Rexx carrying forward the Rexx philosophy of "human-centricness" in its
design makes it an
easy to learn language, yet a powerful one, which allows me at a Business
Administration University
to teach oo-programming from zero knowledge to becoming able to interact and
exploit Windows-OLE, C#
and then Java within one (sic!) semester with a four hour class. The Java
support is intentionally
used to teach and demonstrate that it is rather easy to create applications,
that do not lock-in
businesses into specific operating systems. ooRexx "surfing Java" allows one to
do the same thing:
create applications that are open on all major operating system platforms by
virtue of exploiting
Java under the covers.
To make a long story short: I have always adhered to the Java rules for the
Rexx users, in that they
are only allowed to access public Java classes, public fields and public
methods ("there must be a
reason why the Java language has defined these rules" :) ). The exception are
protected members of a
Java class that are accessed via instances of subclasses (maybe even created
for ooRexx on the fly
at runtime) in order to adhere to the Java model as close as possible. So the
classic Java
reflection (BSF4Rexx the initial Rexx-Java bridge worked even with Java 1.1.8,
sic!, on OS/2)
mechanism is really at the heart of this implementation, hence the question.
---rony
P.S.: Even if it is the first time you might have heard of Rexx/ooRexx do not
mistake that with
Rexx/ooRexx not being deployed in quite a few large shops on quite a large
scale in addition. For me
a great value lies in ooRexx easy syntax that allows me to teach it and the oo
concepts faster than
in any other programming language that I have experimented with in the past 25
years with Business
Administration students.