4

Java を使用して他の (Java) アプリケーション用のラッパー アプリケーションを実装することは可能ですか?

目的は、特定のドキュメントの操作に使用されるアプリケーションとは無関係に、ドキュメントの使用ポリシーを適用することです。

EG 暗号化されたファイルを復号化し、何らかのエディタで開く必要があります。そのため、ラッパー アプリケーションはファイルを復号化し、アプリケーション内でエディターを起動して、たとえばアプリケーションへの書き込みアクセスを拒否することで読み取り専用ポリシーを適用します。したがって、このRuntime.getRuntime().exec(<command>)方法はうまく適合しません:)

同じアプリケーション内でメソッド呼び出しをインターセプトする方法もいくつかありますが、他のアプリケーション全体をラップする方法はありません。

また、ファイル アクセスをインターセプトするために JVM 自体を変更することについても読みました。それはかなりいいですね。しかし、ユーザーに応じてポリシーを動的に変更する必要があります。私が今までに知っている限り、それはうまくいかないかもしれません。

Java コードを使用してこれを行う方法はないかもしれませんが、何らかのヒントやヘルプをいただければ幸いです。

4

2 に答える 2

2

また、ファイル アクセスをインターセプトするために JVM 自体を変更することについても読みました。それはかなりいいですね。しかし、ユーザーに応じてポリシーを動的に変更する必要があります。

SecurityManagerオーバーライドcheckWrite(String)して例外をスローする カスタムを設定します。

子フレームが VM から出ないようにする簡単な例を次に示します ( checkExit(int))。

import java.awt.GridLayout;
import java.awt.event.*;
import java.security.Permission;
import javax.swing.*;

/** NoExit demonstrates how to prevent 'child' applications from 
 * ending the VM with a call to System.exit(0). */
public class NoExit extends JFrame implements ActionListener {

    JButton frameLaunch = new JButton("Frame");
    JButton exitLaunch = new JButton("Exit");

    /** Stores a reference to the original security manager. */
    ExitManager sm;

    public NoExit() {
        super("Launcher Application");

        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

        sm = new ExitManager( System.getSecurityManager() );
        System.setSecurityManager(sm);

        setLayout(new GridLayout(0,1));

        frameLaunch.addActionListener(this);
        exitLaunch.addActionListener(this);

        add( frameLaunch );
        add( exitLaunch );

        pack();
        setSize( getPreferredSize() );
        setLocationByPlatform(true);
    }

    public void actionPerformed(ActionEvent ae) {
        if ( ae.getSource()==frameLaunch ) {
            TargetFrame tf = new TargetFrame();
        } else {
            // change back to the standard SM that allows exit.
            System.setSecurityManager(
                    sm.getOriginalSecurityManager() );
            // exit the VM when *we* want
            System.exit(0);
        }
    }

    public static void main(String[] args) {
        NoExit ne = new NoExit();
        ne.setVisible(true);
    }
}

/** Our custom ExitManager does not allow the VM to exit, but does 
 * allow itself to be replaced by the original security manager. */
class ExitManager extends SecurityManager {

    SecurityManager original;

    ExitManager(SecurityManager original) {
        this.original = original;
    }

    /** Deny permission to exit the VM. */
    public void checkExit(int status) {
        throw( new SecurityException() );
    }

    /** Allow this security manager to be replaced,
  if fact, allow pretty much everything. */
    public void checkPermission(Permission perm) {
    }

    public SecurityManager getOriginalSecurityManager() {
        return original;
    }
}

/** This example frame attempts to System.exit(0) on closing, we must 
 * prevent it from doing so. */
class TargetFrame extends JFrame {

    TargetFrame() {
        super("Close Me!");
        add(new JLabel("Hi!"));

        addWindowListener( new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.out.println("Bye!");
                System.exit(0);
            }
        });

        pack();
        setSize( getPreferredSize() );
        setLocationByPlatform(true);
        setVisible(true);
    }
}
于 2012-06-07T14:23:42.070 に答える
0

Eclipse RPC は検討するのに適したオプションかもしれません。実行時に保存やその他の機能を有効/無効にするために簡単に変更できるエディター ビューを提供します。Eclipse は Java で作成されているため、既にお持ちのほとんどの Java コードは、フレームワークで問題なく動作します。

于 2012-06-07T14:00:41.680 に答える