gpt4 book ai didi

java - 在运行时重定向方法调用以引入某种沙箱

转载 作者:行者123 更新时间:2023-11-30 08:00:13 25 4
gpt4 key购买 nike

我正在解决这个问题。希望有 Elixir 。

我有一些单例(~10),它们都有一些功能(每个~10)。我的函数调用看起来像这样(正如它们应该的那样)。 注意:大多数这些调用都是异步的,不会返回任何内容。只有少数是同步的

SingletonClassGorrilla.getInstance().methodSwim(swimmingPool, lifeJacket, whistle);
SingletonClassRacoon.getInstance().methodBark(thief, owner);

我需要将所有这些调用放入沙箱中:

Sandbox.runThisInSandboxMode(new Runnable{
@Override
public void run(){
SingletonClassGorrilla.getInstance().methodSwim(swimmingPool, lifeJacket, whistle);
}
});

由于调用的地方数量巨大,我希望能够在Singleton端实现sandboxMode

可能的解决方案(但不可行,因为我必须像这样包装函数的数量):

public class SingletonClassGorrilla{
public void methodSwim(WaterBody waterBody, Instrument instrument,
EmResponse emResponse){

Sandbox.runThisInSandboxMode(new Runnable{
@Override
public void run(){
methodSwim(swimmingPool, lifeJacket, whistle, true);
}
});

}

private void methodSwim(WaterBody waterBody, Instrument instrument,
EmResponse emResponse, boolean fromSandbox){

// Do your thang.

}
}

无论如何,通过使用反射/注释/语言中的任何其他东西,可以减少所需的更改量吗?

最佳答案

您可以使用 Proxy使用合适的 InvocationHandler (尽管您必须为每个单例提取一个接口(interface))。免责声明:我还没有尝试实际编译/运行此代码,但它应该为您提供总体思路。如果您关心单例的返回值,则可能必须在沙箱接口(interface)中使用 Callable 来代替 Runnable

public class SingletonGorilla implements GorillaInterface {
private static SingletonGorilla theRealGorilla;
public static GorillaInterface getInstance() {
//In reality, you'd want to store off the Proxy as well
return Proxy.newProxyInstance(SingletonGorilla.class.getClassLoader(), GorillaInterface.class, new SandboxingHandler());
}

private static class SandboxingHandler implements InvocationHandler () {
public Object invoke(Object proxy, Method method, Object[] args) {
return Sandbox.runInSandbox( new Runnable() {
public void run () {
method.invoke(proxy, args));
}
}
}
}

关于java - 在运行时重定向方法调用以引入某种沙箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32079580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com