Re: How to let the methods of a class only can be invoked by a
special package(the class not in the package)?
On Jan 23, 12:03 am, Andreas Leitgeb <a...@gamma.logic.tuwien.ac.at>
wrote:
Jebel.S...@gmail.com <Jebel.S...@gmail.com> wrote:
On Jan 22, 12:51 pm, Patricia Shanahan <p...@acm.org> wrote:
Jebel.S...@gmail.com wrote:
There is a class A in package XX.ZZ.GG , and A has a static method
A.GetInstance(). There are 3 classes B, C, D in package XX.ZZ .
How can I make the A.GetInstance() only can be invoked by the B, C and
D.
There are really untidy things you could do at run time to get a stack
trace and check that the caller is one of the specified method.
However, it would be much better to reorganize the packaging.
Patricia
Unfortunately I have no right to reorganize the packaging, and I don't
known how to get a stack in the JVM with Ver 1.3 .
You could throw an exception, catch it immediately, and see what you
can read from the exception's printStackTrace(), by passing it your
own PrintWriter (or PrintStream), wrapped around some ByteArrayOutputStream.
I just tried it with an (admittedly newer-than-1.3) java:
class X {
public static void main(String[] args) { foo(); }
public static int foo() {
try {
throw new Exception("foo");
} catch (Exception e) {
e.printStackTrace(System.out);
}
return 0;
}}
Try, if that also works with java-1.3, in that it also
writes the "outer"-levels. To implement this in to-be-
protected code, You'd of course not print to stdout, but
instead to a bytearray.
Happy parsing that automatically. :-)
... But then, again, it's quite an unusual wish, what you made.
Thanks for all of you. You let me to find the limitation of my design.
So I change it.
I changed my design:
1 Add a protect method GetInstance() in Class B;
2 Add a class E which is extends from B in package XX.ZZ.GG. Create a
protected method GetInstance() which has the same function of
A.GetInstance() in class E. Remove the Method A.GetInstance().
3 Add a static member 'B e ' withe the default access right in Class
B, construct 'e'in the static block of B as 'E':
static{ e = new E; }
In this design B,C and D can invoke B.e.GetInstance() which is
E.GetInstance(), any other classes that is not in package XX.ZZ (and
also not in package XX.ZZ.GG) can't invoke the E.GetInstance().
Is my design OK ?