6

Java では、アクセス修飾子をデフォルト (空白) のままにしておくと、同じパッケージ内のメンバーのみがフィールドにアクセスできるようになります。ただし、これは、他の人が同じパッケージでクラスを宣言し、そこから「デフォルト」フィールドにアクセスすることを妨げているわけではありません。

JavaでフィールドをC#と同等にする方法はありますかinternal? つまり、自分のライブラリ (JAR ファイル) をビルドするときに、他のユーザーが JAR の外部からそれらのフィールドにアクセスする方法はありませんか? クラスと同じパッケージでクラスを宣言する場合でも。

私のライブラリでの私の宣言は次のとおりです。

package com.my.package;
class MyRestrictedClass{
}



私が防ごうとしているのは、私のライブラリのユーザーが、次のようなビルド パスに追加された私の jar を使用してプロジェクトから実行することです。

package com.my.package; //Add their class to my package
public class DeveloperClass{
    public void main(){
        MyRestrictedClass foo = new MyRestrictedClass();
    }
}
4

2 に答える 2

7

封をすることができます。これにより、人々がクラスパスにクラスを追加できなくなります (ただし、jar を保護する必要はあります)。

http://docs.oracle.com/javase/tutorial/deployment/jar/sealman.html

jar を封印した後も、同じパッケージ内にあると主張するクラスをコンパイルできますが、実行すると実行に失敗します。

Exception in thread "main" java.lang.SecurityException: sealing violation: can't seal package org.splore.so.access: already loaded
at java.net.URLClassLoader.getAndVerifyPackage(URLClassLoader.java:395)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:417)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.splore.so.access.AccessTestFromOtherPackage.main(AccessTestFromOtherPackage.java:5)
于 2013-11-04T16:45:35.487 に答える
-1

「保護」などの他のアクセス修飾子を試してみてください。ただし、誰かが本当にメソッドにアクセスしたい場合は、リフレクションを使用して実行時に修飾子をオーバーライドし、必要に応じて使用できるようにすることができます。彼らはさらに進んで、たとえば最終フラグなどを削除することができます。したがって、適切な修飾子を使用すると、誰もクラスにアクセスできないと想定するのは安全ではありません。

今はわかりませんが、ライブラリのユーザーがクラスを使用してはならないことを理解するのに役立つ注釈がある可能性があります (提供するパブリック API を除く)。@depricated とかに似たものがあるのか​​もしれませんが、自分では使っていません。

于 2013-11-04T16:49:23.793 に答える