Ich denke, wenn man extreme sein wollen, können Sie den Stack-Trace wie diese:
public class Bar {
//...
private Object fooBar() {
try {
throw new CheckIfCalledFromMethodException();
} catch(CheckIfCalledFromMethodException e) {
//here you have access to stack trace in your exception
}
//Do something
}
//...
}
ich ein einfaches Szenario zusammengestellt, in der überprüft, ob die second
Instanz, die die Klasse ruft die gleiche ist Objekt oder etwas anderes.
public class StackTraceTest {
private void execute() {
try {
throw new Exception();
} catch (Exception e) {
/*for(int i = 0; i < e.getStackTrace().length; i++) {
StackTraceElement stackTraceElement = e.getStackTrace()[i];
System.out.println(stackTraceElement.getFileName());
}
System.out.println("");
e.printStackTrace();*/
if(!e.getStackTrace()[1].getFileName().equals(StackTraceTest.class.getSimpleName() + ".java")) {
throw new IllegalAccessError("Illegal Access.");
}
}
}
public void executeExternal() {
this.execute();
}
}
Und
public class AccsessorTest {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
StackTraceTest stackTraceTest = new StackTraceTest();
stackTraceTest.executeExternal();
System.out.println("Accessed from within other method in class.");
System.out.println("");
Class<?> clazz = StackTraceTest.class;
Method method = clazz.getDeclaredMethod("execute");
method.setAccessible(true);
System.out.println("Accessing through reflection...");
method.invoke(stackTraceTest);
}
}
Dann bekomme ich
Accessed from within other method in class.
Reflection test start.
Accessing through reflection...
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at stacktracetest.another.AccsessorTest.main(AccsessorTest.java:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: java.lang.IllegalAccessError: Illegal Access.
at stacktracetest.StackTraceTest.execute(StackTraceTest.java:18)
... 10 more
Also ich denke, es möglich ist, mit Stack-Trace Element Magie zu überprüfen, aber Sie sollten überprüfen, ob dies tatsächlich funktioniert, ist dies extrem grob und ich habe es gerade vor einer Sekunde zusammengefügt.
Sie haben bereits die Leute davon abgehalten, Ihre Methode aufzurufen, indem Sie sie privat machen. – aioobe