代码之家  ›  专栏  ›  技术社区  ›  ShaDooW

Install4j:如何检查RemoteCallable正在运行的Unlevated

  •  1
  • ShaDooW  · 技术社区  · 6 年前

    我的安装程序在安装过程中将一些信息存储在单例类中。现在,我注意到在提升的操作中,singleton类没有相同的实例。到目前为止,我还没有找到任何解决方法/解决方案,使它们共享同一个实例。所以,我决定确保,如果任何人想要获得singleton的实例,他们必须从一个不相关的环境中调用。让我们假设singleton如下所示:

    public class InvestigatorReport {
    
        private final List<Report> reports = new ArrayList<>();
        private final static InvestigatorReport INSTANCE = new InvestigatorReport();
    
        private InvestigatorReport() {
            MyLogger.logInfo(getClass(), "initiating...");
        }
    
        public static InvestigatorReport getInstance(Context context) {
            if (context.hasBeenElevated()) {
                throw new IllegalAccessError(
                        "this method must be called unelevated!");
            }
            return INSTANCE;
        }
    
        private boolean addReport(Report report) {
            return reports.add(report);
        }
     }
    

    但问题是,在某些情况下,我必须从提升的action类调用此add report。因此,我在我的高级动作课上尝试了以下几点:

    if (context.hasBeenElevated()) {
                return (Boolean) context.runUnelevated(new RemoteCallable() {
                    @Override
                    public Serializable execute() {
                        return getInstance(context).addReport(report);
                    }
                });
            }
    

    但是,您可以看到,如果我将同一个上下文对象从提升的action类传递到 RemoteCallable 所以,即使我在经营一个不知名的班级 context.hasBeenElevated() 仍然返回true。

    除了上下文之外,还有其他方法可以检查标高吗?如果你有其他更好的办法阻止任何人打电话给单身汉 getInstance() 方法,我洗耳恭听。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Ingo Kegel    6 年前

    我会使用不同的模式。将singleton的所有方法都设为静态,并将数据访问包装为 runUnelevated 电话:

    public static boolean addReport(Report report, Context context) {
        context.runUnelevated(new RemoteCallable() {
            @Override
            public Serializable execute() {
                 InvestigatorReport.reports.add(report);
                 return null;
            }
        });
    }
    

    这样,您就可以从提升和未提升的代码中调用方法,而无需在调用站点进行任何检查。