Future.get()在任务完成后多次调用Java时,Java的行为如何?它会返回相同的结果吗?或者,ExecutionException如果计算失败,会一次又一次地抛出相同的异常吗?我在文档中找不到任何关于它的东西!
我正在尝试Java模块系统。我正在尝试将ServiceLoader用于通用接口。它可以工作,但是我在module-info中收到警告。这是我的最小代码
module testProvideWith {
provides ServiceGeneric with SString;
uses ServiceGeneric;
}
public interface ServiceGeneric<T> {
T getT();
}
public class SString implements ServiceGeneric<String>{
public String getT() {return "Hello";}
}
Run Code Online (Sandbox Code Playgroud)
尝试时收到警告我并不感到惊讶
ServiceGeneric<String> serv=ServiceLoader.load(ServiceGeneric.class).findFirst().get();
Run Code Online (Sandbox Code Playgroud)
我知道通用擦除,我知道我必须使用注释或其他技巧来注释正确的服务。但是...我没有找到所有通用服务。我希望能够写类似
module testProvideWith {
provides ServiceGeneric<String> with SString;
uses ServiceGeneric<String>;
//more cases could be added
}
...
ServiceLoader.load(ServiceGeneric.class,String.class)
Run Code Online (Sandbox Code Playgroud)
模块和加载程序在哪里协作以跟踪可用的通用版本..但是...什么都没有...没有人考虑过这种可能性...我想念什么吗?
我是一名大学讲师,我正在修改关于 Java 反射的讲座。其他几年,当我讲授抑制访问检查的可怕之处时,我向您展示了您可以设置一个 SecurityManager 并执行类似的操作
if ("suppressAccessChecks".equals(p.getName())){
StackTraceElement[] st = Thread.currentThread().getStackTrace();
if(.. st ..) { throw new SecurityException(); }
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以允许列入白名单的反序列化器仅调用suppressAccessChecks。然而,现在他们正在弃用 SecurityManager。我认为新的模块系统应该在这里有所帮助,但我找不到解释如何支持上面白名单反序列化器的想法的资源。
有什么提示吗?