问题标签 [package-private]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
56 浏览

android - 如何阻止从库外部访问对象?

我正在开发一个库,在 android 上有太多对象。所以我必须用包对类进行分组。我想从 C 访问 A 类,但我想阻止从 Project X 访问这些对象。所以我不能使用私有包(默认)和“公共”标识符。

可能吗 ?反正有没有包的类?谢谢。

0 投票
4 回答
1331 浏览

java - 访问包私有变量的好习惯是什么?

从同一个包中的其他类访问我的包私有变量的好习惯是什么?

  1. 包私有访问器

    /li>
  2. 只需从对象中作为字段访问。

    /li>

在我看来:

  1. 用于访问包私有字段的包私有方法。很多不必要的代码,但我认为提供了很多字段的清晰度(以及正确命名的访问器方法)

  2. 我们不需要包中包私有变量的访问器和修改器,所以也许我不应该创建它们?

哪种做法更好,符合编程约定?

编辑:感谢您的快速回答!:)

0 投票
1 回答
1998 浏览

java - 为什么我无法访问另一个 jar(未密封)中的包私有类?

我遇到了 Java 类加载器的奇怪行为:

假设我向集群提交了一个 Apache Spark jar,其中包含 HiveServer2 的扩展:

HiveServer2.ServerOptionsProcessor 类已经预加载到集群上(作为 Spark 依赖项),但被声明为包私有。

设置集群时,此类首先加载到 JVM。然后,当我的应用程序提交时,我的类(在另一个 jar 中)由同一个 JVM 加载。

此时我收到以下错误:

线程“主”java.lang.IllegalAccessError 中的异常:类 org.apache.hive.service.server.DPServerOptionsProcessor 无法在 java.lang.ClassLoader.defineClass1 访问其超类 org.apache.hive.service.server.HiveServer2$ServerOptionsProcessor( Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:763) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) at java .net.URLClassLoader.access$100(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:368) at java.net.URLClassLoader$1.run(URLClassLoader.java:362) at java.security .AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:361) at java.lang.ClassLoader。loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at org.apache.spark.sql.hive.thriftserver.DPHiveThriftServer2$.main(DPHiveThriftServer2.scala:26) at org. apache.spark.sql.hive.thriftserver.DPHiveThriftServer2.main(DPHiveThriftServer2.scala) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect。 DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$ runMain(SparkSubmit.scala:731) at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181) at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206) 在 org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121) 在 org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

我的印象是包私有类可以被同一个包中的任何其他类访问。而且我已经仔细检查了 Spark 罐子中的清单文件,它们都没有将 org.apache.hive.service.server 声明为密封包。那么为什么 JVM 类加载器给了我这个错误呢?JVM 使用什么条件触发异常?

0 投票
1 回答
2699 浏览

java - 如果 EJB bean 方法是包私有的,为什么没有检测到它?

这个让我很困惑。我基于在 Wildfly 10.1 上运行的 JavaEE7 创建了一个最小的 JAX-RS 应用程序。

资源注入一个单一的虚拟无状态 bean:

这是豆子:

使用浏览器执行 GET 会导致以下错误:

可以发布完整的堆栈跟踪,但所有 Caused By 消息都是相同的。

我搜索了这个错误,当注入的 bean公开时发生,但我的是。我决定尝试删除公众,看看它会抱怨什么,并且......它有效。注入 bean,注入它可能进行的任何注入,调用 post 构造方法并打印所有打印。

这与Does ejb stateless class has to be public完全相反?. 这里发生了什么?

更新

Oliv37 提示我做一些测试,结果如下:

  • 如果callis package,那么它仅在Manageris时有效package
  • 如果callpublic,它无论如何都可以工作。
  • 如果callfinal,则仅当是@PostConstruct时才调用该方法。Managerpackage

现在问题变成了:为什么该方法需要公开才能使 CDI 检测起作用,以及为什么将其设为 final 会导致如果类是公开的,则不会调用 post 构造方法?

更新2

完整的堆栈跟踪:

0 投票
1 回答
238 浏览

java - 为什么方法的私有访问比包私有更可取?

Java 开发人员总是对在这个类之外不使用的方法使用私有访问级别。这样做有已知的好处,但另一方面我们增加了单元测试的复杂性。在大多数情况下,我们的代码不被任何其他服务/API 使用,我们实际上并不关心“私人”利益。但我相信我们关心的是创建可读的简单单元测试。考虑到这一点,为什么不在默认情况下将类中的所有方法都创建为“包私有”,并且仅在我们真正需要的情况下才将它们设为“私有”?

0 投票
2 回答
170 浏览

scala - 是否可以扩展在 Scala 中的 3rd 方 jar 中定义的包私有类

是否可以在 scala 中扩展在 3rd 方 jar 中定义的包私有类。因此,例如,如果我的代码所依赖的第 3 方 jar 具有这样的类

我可以在我的代码中以某种方式子类这个类吗?

谢谢

0 投票
2 回答
222 浏览

scala - 如何创建包私有的类的模拟对象

我有一堂课。它有一个A带有工厂方法的伴随对象。

A类私有[somepackage](x:Int){

}

对象 A { def createA(y: Int): A = { new A(y) } }

现在我需要A在不同包中的 scalatest 文件中创建模拟对象。

当我给

private val a = mock[A] --> 我得到编译错误。

<< >>中无法访问A类中的构造函数。有没有更好的方法来模拟对象?Asomewhere

0 投票
1 回答
39 浏览

java - 包(共享名称)是否在编译过程中合并?

我几乎可以肯定有人问过这个问题,但我不确定要搜索什么。

无论如何,我很好奇是否可以创建一个扩展类ByteBuffer。我认为这是不可能的,因为ByteBuffer有包私有的构造函数:

但是,我发现如果您在与其父级共享名称的包中创建您的类,那么它可以完美编译。

它也可以在 Java 9 和 Java 10 中编译,但仅--patch-module在编译时使用:

我的问题是:这是如何(以及为什么)编译的?

0 投票
0 回答
106 浏览

java - 添加具有相同包名的外部类并破坏封装

当我读一本关于 Kotlin 的书时,我遇到了这样的说法:

使用 Java,封装很容易被破坏,因为外部代码可以在您的代码使用的相同包中定义类,从而访问您的包私有声明......

我不确定我是否完全正确,但这是否意味着我可以以某种方式在同一个包中定义一个类,例如,我依赖的第三方模块然后访问它的包私有数据?还是有别的意思?

0 投票
1 回答
34 浏览

java - 复杂继承/包组合中的包私有成员可见性 - Qiuck 通用规则验证可见性

如果 Base 和 Derived 类位于不同的包中,则来自Base的 package-private 成员不应被继承,因此它不应在Derived中不存在,即此类成员将无法通过并且-在任何一种情况下都会产生编译错误!Base obj = new Derived()Derived obj = new Derived()obj.member()

但我看到Base obj = new Derived(),obj.f()是可访问的!

是的,私有成员仍然存在,因为当我创建new Derived()then时new Base(),它的所有私有成员也被创建(在引擎盖下)。但是,如果我将下面代码中的 package-private 更改private ,则会 出现编译错误(隐式存在的)其超类(基类)的私有 (-) 成员。f()obj.f()Base obj = new Derived()

(-)(因为 Base 和 Derived 在不同的包中)

最后

您能否制定一个快速简便的实用规则(换句话说,不是在 JLS 和常见的默认可见性定义中)如何理解复杂继承/包组合中的可见性(访问)(我们可能有复杂的层次结构 Base-> Derived->Derived2->Derived3 并且每个类都可以在相同/不同的包中。如何快速查询可访问性?

例如,对于(基类的)受保护成员,“快速猜测”规则非常简单:

  1. 如果Base 和 Driver 在同一个包中(即来自代码Base obj = new Base(); obj.baseProtectedMember(); 编译的任何 Driver 的方法)=> 任何组合都可以工作(Base obj1 = new Derived2(); Derived2 obj2 = new Derived2() 等 -obj1.baseProtectedMember() 并且obj2.baseProtectedMember()是可见的并且可以是称为)。而且我们不在乎其他类在什么包中!
  2. 如果 Base 和 Driver 不在同一个包中(即来自任何 Driver 的方法,代码Base obj = new Base(); obj.baseProtectedMember(); 不会编译)=> 任何组合(参见 1)都不起作用。而且我们不在乎其他类在什么包中!

但是对于包私有成员,我们确实关心哪个层次类在哪个包中,我无法为一般情况制定一个简单可靠的“快速猜测”规则......

PS有趣的旁注:

如果我在上面的代码片段(帖子顶部)中覆盖 Derived 和 DerivedFromDerived 中的方法(将它们保留为包私有),则输出为: