问题标签 [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.
java - Java中的内部包保护访问修饰符
据我所知,当其类具有访问修饰符时,不可能在 Java 内部包受保护的访问修饰符(例如internal protected
在 C# 中)中为类成员添加经典方法public
。你知道有什么方法或设计模式可以做到这一点吗?
为什么在 Java 中没有语法支持来做到这一点?(或者为什么它在 C# 中?)
java - java编译器如何解析非导入名称
考虑我X
在包中的 java 编译单元中使用了一个类型,foo.bar
并且X
没有在编译单元本身中定义,也没有直接导入。java编译器X
现在如何有效地解析?有几种可能X
存在的地方:
X
可能通过星形导入导入a.b.*
X
可能与编译单元位于同一包中X
可能是一种语言类型,即驻留在java.lang
我看到的问题尤其是(2.)。由于X
可能是包私有类型,因此甚至不需要X
驻留在名为X.java
. 因此,编译器必须查看类路径的所有条目并搜索包中的任何类foo.bar
,然后必须读取包中的每个类foo.bar
以检查是否X
包含。
这听起来非常昂贵。特别是当我只编译一个文件时,编译器必须读取几十个类文件才能找到一个类型X
。如果我使用大量星形导入,则必须对很多类型重复此过程(当然,类文件不会被读取两次)。
那么是否建议从同一个包中导入类型以加快编译过程?或者有没有更快的方法来解决X
我找不到的未导入类型?
android - 使用 ART 错误调用具有默认(包)可见性的 Android 方法
我在这样的不同包中有两个类。基类:
和子类:
我有一个 Child 类的对象,我调用 child.boo() 我希望打印“Child”。这真的是我通常得到的。使用 Dalvik,它实际上总是有效的。但是当我切换到 ART 时,我得到了 2 个不同的输出。
当从 Child 类的“包树”调用 child.boo() 时,我得到“Child”。问题是当我从包 com.example.artpackageprivate.base 中的类调用它时。结果是“Base”,尽管对象是 Child 类的一个实例。
这是进行调用的 Activity 类代码(Activity 仅包含 2 个按钮):
在 Dalvik 和 ART(都是 android Kitkat)上运行这段代码,我得到了 2 个不同的结果。按下 BaseButton 结果始终是“Base”。ChildButton 的结果是 Dalvik 上的“Child”和 ART 上的“Base”。这怎么可能?这是ART中的某种错误吗?
java - 包私有类对不同源文件夹下的某些其他包(具有相同名称)可见
当我在 Java 中对包和包私有类进行一些测试时,我注意到一件有趣的事情。以下是我的项目源码结构,源码文件夹下包中的类是MyTestClass.java
包保护类。据我了解,这不应该在这个包之外访问。但是,有趣的是,类也可以在源文件夹下访问。仅当包名称相同时才会发生这种情况,尽管它们位于不同的源文件夹中。com.test.pkg
src
MyTestClass.java
com.test.pkg
test
有人能告诉我为什么会这样吗?
java - java - 如何让两个不同的包访问彼此的类,而不允许任何其他第三个包在java中访问它?
我正在 netbeans 中制作一个项目,并面临与本网站上已经提出的问题类似的问题 - 如何在 Java 中的两个包之间共享包私有数据?,与假设应用程序开发人员可以看到我的代码库略有不同。我的想法是让包 B 中的公共类说“通信器类”,其构造函数具有默认包访问权限并将其实例传递给包 A 的类的构造函数。基本上我正在阻止开发人员(使用包 C)实例化包 A 中的任何类。这会起作用,但是我猜这不是 SE 的好方法。此外,这个问题是三年前提出的。现在有没有更好的方法/技术可用,它是 NEAT 和/或涉及更少的包 A 和 B 之间的耦合。
PS:我是java新手。任何帮助,将不胜感激。
java - 有没有办法在 java 中使用 package-private 来允许其他包访问?
所以我在 C# 中工作了很多年,现在在 Java 中工作。在 C# 中,您可以使用 internal 关键字从公共视图中隐藏类/方法,但如果您特别授予它,则允许某些程序集/包访问。当我在 Java 中环顾四周时,我看不到任何与内部相同的东西。
我发现了包私有。但是,这使它对外界完全隐藏。Java中有没有办法允许某些其他包访问内部代码而不将其公开?
如果您问我为什么要这样做,答案通常是单元/集成测试或需要某些受信任的包访问代码以不重复它。我知道有些人认为您不应该测试私有/内部代码。我也知道允许内部访问通常不是好的软件工程。我对这些话题的讨论并不感兴趣,只是好奇你能不能做我想做的事。
谢谢。
java - javadoc和包私有接口?
这可能与如何防止出现在 Javadoc 中的包私有接口相同的问题?. 但我觉得情况有点不同。
当我生成 javadoc 时,我在 John 的页面上看到了以下定义。
这是正常的吗?有没有办法隐藏包私有接口中定义的那些方法?
unit-testing - Kotlin:使内部函数对单元测试可见
如果测试与生产代码(这很常见)位于不同的模块中,那么使内部函数对测试可见的最佳方法是什么?
在Java中,我会将生产代码和测试放在同一个包中,并使待测试的方法包私有(另外,@VisibleForTest
如果让它包私有而不是私有的唯一原因是测试)。不幸的是,Kotlin 没有包私有的概念。
java - 从 Java 可见的 Scala 中的包私有范围
当从 Java 代码中使用从 Scala 代码生成的字节码时,我刚刚发现了 Scala 范围界定的一个非常奇怪的行为。考虑使用 Spark(Spark 1.4、Hadoop 2.6)的以下代码段:
这段代码失败了,这是预料之中的,因为我Broadcast
在使用它之前自愿销毁了它,但问题是在我的心智模型中它甚至不应该编译,更不用说运行良好了。
事实上,Broadcast.destroy(Boolean)
被声明为private[spark]
它不应该在我的代码中可见。我会尝试查看字节码,Broadcast
但这不是我的专长,这就是我更喜欢发布这个问题的原因。另外,抱歉我懒得创建一个不依赖于 Spark 的示例,但至少你明白了。请注意,我可以使用 Spark 的各种包私有方法,而不仅仅是Broadcast
.
知道发生了什么吗?
java - Lambda 表达式在运行时失败并出现 java.lang.BootstrapMethodError
在一个包 ( a
) 中,我有两个功能接口:
-
超接口中的apply
方法取self
为 an A
,否则,如果Applicable<A>
改为使用,则该类型在包外将不可见,因此无法实现该方法。
在另一个包(b
)中,我有以下Test
类:
第一个实现使用匿名类,它可以正常工作。另一方面,第二个编译得很好,但在运行时失败,在尝试访问接口时抛出java.lang.BootstrapMethodError
由 a 引起的 a 。java.lang.IllegalAccessError
Applicable
我认为如果 lambda 表达式要么像匿名类一样工作,要么给出编译时错误,这将更有意义。所以,我只是想知道这里发生了什么。
我尝试删除超级接口并在其中声明方法,SomeApplicable
如下所示:
这显然使它工作,但让我们看到字节码有什么不同。
从 lambda 表达式编译的合成lambda$0
方法在这两种情况下似乎相同,但我可以发现引导方法下方法参数的一个差异。
#59
从(La/Applicable;)V
到的变化(La/SomeApplicable;)V
。
我真的不知道 lambda metafactory 是如何工作的,但我认为这可能是一个关键的区别。
我还尝试像这样显式声明该apply
方法SomeApplicable
:
现在该方法apply(SomeApplicable)
实际存在并且编译器为apply(Applicable)
. 在运行时仍然会抛出相同的错误。
在字节码级别,它现在使用LambdaMetafactory.altMetafactory
而不是LambdaMetafactory.metafactory
: