Axi*_*xus 6 c# java access-modifiers internal
在Java中,通过将访问修饰符保留为默认值(空白),只有同一包中的成员才能访问这些字段.但是,这并不妨碍其他人在同一个包中声明他们的类,然后从那里访问"默认"字段.
在Java中是否有一种方法可以使字段C#等效于internal.也就是说,当我构建我的库(JAR文件)时,别人无法从JAR外部访问这些字段?即使在与我的类相同的包中声明它们的类.
这是我在图书馆的声明:
package com.my.package;
class MyRestrictedClass{
}
Run Code Online (Sandbox Code Playgroud)
我试图阻止的是我的库的用户从他们的项目做我的jar添加到他们的构建路径,如:
package com.my.package; //Add their class to my package
public class DeveloperClass{
public void main(){
MyRestrictedClass foo = new MyRestrictedClass();
}
}
Run Code Online (Sandbox Code Playgroud)
你可以密封包装.这可以防止人们在类路径中添加类(尽管你仍然需要保护你的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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1213 次 |
| 最近记录: |