问题标签 [java-synthetic-methods]

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 回答
6984 浏览

inline - 内联函数无法访问非公共 API:@PublishedApi vs @Suppress vs @JvmSynthetic

在 Kotlin 中,当我有一个非公共成员并inline fun调用它时,会出现编译错误:

Error:(22, 25) Kotlin: Public-API inline function cannot access non-public-API private fun f(): Unitdefined incom.example

我找到了几种在 public 中调用我的函数的方法inline fun,但哪种方法最好呢?

假设我有一个private fun f() { }. 然后我找到的选项是:

  • fun f() { }

    就公开吧。这是基准解决方案,但如果其他解决方案有很大的缺点,这可能是最好的解决方案。

  • @PublishedApi internal fun f() { }

    在Kotlin 1.1-M04中引入,注释可以应用于内部成员,使其有效地公开。我注意到的含义是任何库用户仍然可以从 Java 代码中调用它,这就是我不喜欢它的地方。

  • @Suppress("NON_PUBLIC_CALL_FROM_PUBLIC_INLINE") inline fun g() { f() }

    在stdlib 源代码中找到,此注释在应用于调用函数时似乎抑制了错误。但它的局限性是什么?它只能用于inline功能吗?生成的程序在某些情况下会失败吗?我试图用这个技巧从一个内联函数中调用一个非内联函数,它奏效了,但它看起来很可疑。

  • @JvmSynthetic @PublishedApi internal fun f() { }

    将第二种解决方案与字节码中的合成标志结合起来。我不确定这是否@JvmSynthetic@PublishedApi internal.

那么,这些解决方案中的哪一个是从公共内联函数调用非公共函数的最佳方式?我看不到的每种解决方案的缺点是什么?

0 投票
1 回答
526 浏览

intellij-idea - 具有所有合成方法的 IntelliJ 反编译类

我正在使用带有内置反编译器的 IntelliJ。我想反编译一个 .class 文件并查看由 java 编译器创建的所有方法(例如合成桥方法桥方法)。在 IntelliJ 中是否有可能做到这一点?

0 投票
0 回答
53 浏览

java - java中的桥接方法或合成方法是什么?

我刚刚听说过java中的这些新词——Synthetic 和 Bridge 方法。我已经搜索过它们,但互联网上没有太多信息。有人可以详细说明java中有哪些桥接或合成方法吗?

0 投票
0 回答
158 浏览

java - Java 枚举 - ENUM$VALUES 或 $VALUES

如何确定用于命名在枚举中创建的合成属性以将其值存储在 Java 中的逻辑?

我一直试图找到任何一个文档都没有运气,我还查看了源代码,看看我是否能够自己获得更多的洞察力。到目前为止,我唯一能找到的是这篇文章,显然结论表明它的命名完全取决于编译器,尽管如此,我已经看到在同一项目上的两个命名在不同的类上进行相同的执行。

任何人都可以阐明这个合成领域是如何命名的吗?

或者我如何确定/指示枚举是否会使用 $VALUES 或 ENUM$VALUES 名称?(当然不用先通过反射测试)

0 投票
3 回答
642 浏览

java - Java合成方法和桥接方法混淆

如本Java 教程中所述,桥接方法意味着它也是一种合成方法。问题是,isSynthetic方法的调用是否有可能返回true,但isBridge对于一个对象,方法返回false Method,即,如果一个方法是合成的,是否意味着它也是一个桥接方法?

它并不完全相同,但isSyntheticisBridge方法的源代码如下所示:

为什么isBridge方法体不像return isSynthetic();

0 投票
1 回答
78 浏览

java - Java 模块系统是否因合成字段而损坏?

我正在使用 java 模块系统测试一些字节码生成库。我已经编译了 java 11,并对 java.base module-info.java 进行了以下更改:

然后我用“--illegal-access=deny”选项启动java。当我将此编译后的 java 版本与 javassist 库一起使用时,它会在未命名的模块中生成以下类:

Java 抛出某种“java.lang.IllegalAccessError class SomeJavassistProxy(in unnamed module) cannot access class java.lang.reflect.Method(in module java.base) because module java.base does not export java.lang.reflect to unnamed模块”。

这是预期的行为。

然后我尝试了 bytebuddy 库,它生成了以下类:

这个类也在未命名的模块中生成。但这一次它可以工作并且不会引发任何错误。不知何故,它可以访问 java.lang.reflect,尽管该包不应该被未命名的模块访问。

我看到的唯一区别是 bytebuddy 生成的类中带有 java.lang.reflect.Method 的合成字段。

所以,我的问题是,java 模块系统是否不适用于合成字段?