提问人:RORAK 提问时间:7/14/2022 最后编辑:RORAK 更新时间:7/21/2022 访问量:84
有没有办法获得对在 java 中调用方法的对象的引用?
Is there any way to get reference to object that called a method in java?
问:
我需要某种方法来获取调用某个方法的类的实例。例如,在这个程序中,我想获取名为 method 的实例(此处名为 Jack)。Person
Main.call()
public class Main {
public static Person p;
public static void main(String[] args) {
p = new Person("Jack");
p.call();
}
public static void call() {
Object caller = Magic.getTrace()[1].getObject(); // This is what I need
System.out.println(((Person)caller).getName()); // Output: Jack
Class<?> clazz = Magic.getTrace()[2].getClass(); // This too
System.out.println(clazz.getName()); // Output: Main
}
public class Person {
private String name;
public Person(String _name) {
name = _name
}
public String getName() { return name; }
public void call() {
Main.call();
}
}
那么,有什么方法可以做到这一点吗?这应该是可能的,因为调试器可以使用它。
对于模组:我不想要类的 NAME,而是 INSTANCE...
谢谢!
答:
1赞
Stephen C
7/16/2022
#1
没有一种方法不能相对容易地被颠覆。这使得这种安全机制毫无意义。
请注意,使用 可能(已经)可以做一些事情,但这假设您的代码仅从“沙箱”中的代码调用。并且需要在沙盒中禁用各种东西......从反思开始......这对于现代 Java 程序员来说太麻烦了。SecurityManager
基本上,如果你有一个安全机制,需要对你的代码用户强制执行,那么它就需要在运行他们的代码的JVM之外完成。通常,您将在远程服务器上执行检查...您的用户无法干涉。
(“在服务器中执行此操作”方法可能不可行或对您来说是不可接受的。在这种情况下:对不起,但没有真正的解决方案。只有那些给你一种错觉的方法,你已经解决了问题。
你注意到了这一点:
这应该是可能的,因为调试器可以使用它。
对不起,没有。
调试器使用 debug-agent 来访问他们正在调试的 JVM 的状态。不幸的是(或者也许是幸运的,取决于你的观点!)JVM不能在自己身上使用调试代理。这是行不通的。
我的理解是,调试代理代码在执行其操作时会暂停目标 JVM 中的所有线程。当 JVM 尝试“自我调试”时,这包括 JVM 中尝试使用代理的线程。即时死锁。
此外,想要破坏任何基于代理的安全机制的人只需要在启动 JVM 时不附加代理即可。
评论
Person#call
Person
Main#call
this
Main#call
Person
Lock