问题标签 [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 投票
1 回答
1005 浏览

java - Java中的内部包保护访问修饰符

据我所知,当其类具有访问修饰符时,不可能在 Java 内部包受保护的访问修饰符(例如internal protected在 C# 中)中为类成员添加经典方法public。你知道有什么方法或设计模式可以做到这一点吗?

为什么在 Java 中没有语法支持来做到这一点?(或者为什么它在 C# 中?)

0 投票
2 回答
699 浏览

java - java编译器如何解析非导入名称

考虑我X在包中的 java 编译单元中使用了一个类型,foo.bar并且X没有在编译单元本身中定义,也没有直接导入。java编译器X现在如何有效地解析?有几种可能X存在的地方:

  1. X可能通过星形导入导入a.b.*
  2. X可能与编译单元位于同一包中
  3. X可能是一种语言类型,即驻留在java.lang

我看到的问题尤其是(2.)。由于X可能是包私有类型,因此甚至不需要X驻留在名为X.java. 因此,编译器必须查看类路径的所有条目并搜索包中的任何类foo.bar,然后必须读取包中的每个foo.bar以检查是否X包含。

这听起来非常昂贵。特别是当我只编译一个文件时,编译器必须读取几十个类文件才能找到一个类型X。如果我使用大量星形导入,则必须对很多类型重复此过程(当然,类文件不会被读取两次)。

那么是否建议从同一个包中导入类型以加快编译过程?或者有没有更快的方法来解决X我找不到的未导入类型?

0 投票
1 回答
814 浏览

android - 使用 ART 错误调用具有默认(包)可见性的 Android 方法

我在这样的不同包中有两个类。基类:

和子类:

我有一个 Child 类的对象,我调用 child.boo() 我希望打印“Child”。这真的是我通常得到的。使用 Dalvik,它实际上总是有效的。但是当我切换到 ART 时,我得到了 2 个不同的输出。

当从 Child 类的“包树”调用 c​​hild.boo() 时,我得到“Child”。问题是当我从包 com.example.artpackageprivate.base 中的类调用它时。结果是“Base”,尽管对象是 Child 类的一个实例。

这是进行调用的 Activity 类代码(Activity 仅包含 2 个按钮):

在 Dalvik 和 ART(都是 android Kitkat)上运行这段代码,我得到了 2 个不同的结果。按下 BaseButton 结果始终是“Base”。ChildButton 的结果是 Dalvik 上的“Child”和 ART 上的“Base”。这怎么可能?这是ART中的某种错误吗?

0 投票
1 回答
989 浏览

java - 包私有类对不同源文件夹下的某些其他包(具有相同名称)可见

当我在 Java 中对包和包私有类进行一些测试时,我注意到一件有趣的事情。以下是我的项目源码结构,源码文件夹下包中的类是MyTestClass.java包保护类。据我了解,这不应该在这个包之外访问。但是,有趣的是,类也可以在源文件夹下访问。仅当包名称相同时才会发生这种情况,尽管它们位于不同的源文件夹中。com.test.pkgsrcMyTestClass.javacom.test.pkgtest

有人能告诉我为什么会这样吗?

0 投票
2 回答
1205 浏览

java - java - 如何让两个不同的包访问彼此的类,而不允许任何其他第三个包在java中访问它?

我正在 netbeans 中制作一个项目,并面临与本网站上已经提出的问题类似的问题 - 如何在 Java 中的两个包之间共享包私有数据?,与假设应用程序开发人员可以看到我的代码库略有不同。我的想法是让包 B 中的公共类说“通信器类”,其构造函数具有默认包访问权限并将其实例传递给包 A 的类的构造函数。基本上我正在阻止开发人员(使用包 C)实例化包 A 中的任何类。这会起作用,但是我猜这不是 SE 的好方法。此外,这个问题是三年前提出的。现在有没有更好的方法/技术可用,它是 NEAT 和/或涉及更少的包 A 和 B 之间的耦合。

PS:我是java新手。任何帮助,将不胜感激。

0 投票
2 回答
259 浏览

java - 有没有办法在 java 中使用 package-private 来允许其他包访问?

所以我在 C# 中工作了很多年,现在在 Java 中工作。在 C# 中,您可以使用 internal 关键字从公共视图中隐藏类/方法,但如果您特别授予它,则允许某些程序集/包访问。当我在 Java 中环顾四周时,我看不到任何与内部相同的东西。

我发现了包私有。但是,这使它对外界完全隐藏。Java中有没有办法允许某些其他包访问内部代码而不将其公开?

如果您问我为什么要这样做,答案通常是单元/集成测试或需要某些受信任的包访问代码以不重复它。我知道有些人认为您不应该测试私有/内部代码。我也知道允许内部访问通常不是好的软件工程。我对这些话题的讨论并不感兴趣,只是好奇你能不能做我想做的事。

谢谢。

0 投票
1 回答
895 浏览

java - javadoc和包私有接口?

这可能与如何防止出现在 Javadoc 中的包私有接口相同的问题?. 但我觉得情况有点不同。

当我生成 javadoc 时,我在 John 的页面上看到了以下定义。

这是正常的吗?有没有办法隐藏包私有接口中定义的那些方法?

0 投票
2 回答
20025 浏览

unit-testing - Kotlin:使内部函数对单元测试可见

如果测试与生产代码(这很常见)位于不同的模块中,那么使内部函数对测试可见的最佳方法是什么?

在Java中,我会将生产代码和测试放在同一个包中,并使待测试的方法包私有(另外,@VisibleForTest如果让它包私有而不是私有的唯一原因是测试)。不幸的是,Kotlin 没有包私有的概念。

0 投票
1 回答
1445 浏览

java - 从 Java 可见的 Scala 中的包私有范围

当从 Java 代码中使用从 Scala 代码生成的字节码时,我刚刚发现了 Scala 范围界定的一个非常奇怪的行为。考虑使用 Spark(Spark 1.4、Hadoop 2.6)的以下代码段:

这段代码失败了,这是预料之中的,因为我Broadcast在使用它之前自愿销毁了它,但问题是在我的心智模型中它甚至不应该编译,更不用说运行良好了。

事实上,Broadcast.destroy(Boolean)被声明为private[spark]它不应该在我的代码中可见。我会尝试查看字节码,Broadcast但这不是我的专长,这就是我更喜欢发布这个问题的原因。另外,抱歉我懒得创建一个不依赖于 Spark 的示例,但至少你明白了。请注意,我可以使用 Spark 的各种包私有方法,而不仅仅是Broadcast.

知道发生了什么吗?

0 投票
1 回答
2190 浏览

java - Lambda 表达式在运行时失败并出现 java.lang.BootstrapMethodError

在一个包 ( a) 中,我有两个功能接口:

-

超接口中的apply方法取self为 an A,否则,如果Applicable<A>改为使用,则该类型在包外将不可见,因此无法实现该方法。

在另一个包(b)中,我有以下Test类:

第一个实现使用匿名类,它可以正常工作。另一方面,第二个编译得很好,但在运行时失败,在尝试访问接口时抛出java.lang.BootstrapMethodError由 a 引起的 a 。java.lang.IllegalAccessErrorApplicable

我认为如果 lambda 表达式要么像匿名类一样工作,要么给出编译时错误,这将更有意义。所以,我只是想知道这里发生了什么。


我尝试删除超级接口并在其中声明方法,SomeApplicable如下所示:

这显然使它工作,但让我们看到字节码有什么不同。

从 lambda 表达式编译的合成lambda$0方法在这两种情况下似乎相同,但我可以发现引导方法下方法参数的一个差异。

#59(La/Applicable;)V到的变化(La/SomeApplicable;)V

我真的不知道 lambda metafactory 是如何工作的,但我认为这可能是一个关键的区别。


我还尝试像这样显式声明该apply方法SomeApplicable

现在该方法apply(SomeApplicable)实际存在并且编译器为apply(Applicable). 在运行时仍然会抛出相同的错误。

在字节码级别,它现在使用LambdaMetafactory.altMetafactory而不是LambdaMetafactory.metafactory