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

java - 关于 Java 中私有静态嵌套类的合成访问器的 Eclipse 警告?

我的同事建议使一些 Eclipse 代码格式和警告设置更加严格。这些更改中的大多数都是有意义的,但我在 Java 中得到了这个奇怪的警告。这是一些重现“问题”的测试代码:

与 !!! 在 Eclipse 中使用我的新警告设置给我这个警告:

对封闭构造函数 WeirdInnerClassJavaWarning.InnerClass() 的访问由合成访问器方法模拟。提高其知名度将提高您的绩效。

这是什么意思?当我将“私有静态类”更改为“受保护的静态类”时,警告消失了,这对我来说毫无意义。


编辑:我终于想出了“正确”的修复方法。这里真正的问题似乎是这个嵌套的私有静态类缺少公共构造函数。这一调整删除了警告:

我希望该类是一个私有嵌套类(因此没有其他类可以访问它,包括封闭类的子类)并且我希望它是一个静态类。

我仍然不明白为什么使嵌套类受保护而不是私有是解决“问题”的另一种方法,但这可能是 Eclipse 的一个怪癖/错误。

(抱歉,为了更清楚,我应该称它为 NestedClass 而不是 InnerClass。)

0 投票
3 回答
648 浏览

java - 合成方法的好处是什么?

问题

一位朋友提出了一个有趣的问题。给定以下代码:

从外部类,我如何打印message变量内容?当然,不允许更改方法或字段的可访问

这里的来源,但它是一个法国博客)


解决方案

解决这个问题的代码如下:

请注意,access$000方法名称并不是真正标准的(即使这种格式是强烈推荐的格式),并且某些 JVM 会命名此方法access$0。因此,更好的解决方案是检查合成方法:


所以这个问题的有趣之处在于突出了合成方法的使用。使用这些方法,我可以像在解决方案中那样访问私有字段。当然,我需要使用反射,而且我认为使用这种东西可能会很危险......

问题

作为开发人员,对我来说,合成方法的兴趣是什么?什么是使用合成物有用的好情况?

0 投票
1 回答
1096 浏览

java - 为私有字段生成的合成方法真的会导致性能损失吗?

在 Eclipse 中,当从内部类访问私有字段时,会出现一个可选警告,表示将生成合成访问器方法,并且可以通过将字段设为包私有来提高性能。

这种合成方法真的会导致性能损失吗?我认为访问器通常在运行时内联,不是吗?

0 投票
5 回答
13624 浏览

java - 合成访问器方法警告

我在 Eclipse 中做了一些新的警告设置。有了这些新设置,我面临着一个奇怪的警告。阅读后我知道它是什么,但找不到删除它的方法。

这是我对示例代码的问题

带有* * 的行在 eclipse 中给了我一个警告

问题是,我不想更改testString. 另外,不想为它创建一个吸气剂。

应该做哪些改变?


Lines with**给了我同样的警告。

0 投票
3 回答
10898 浏览

java - “静态合成”是什么意思?

我正在查看一些从 Java 字节码获得的反汇编代码。我看到一些声明如下:

我无法弄清楚syntheticor是什么access$0意思。有人可以帮我理解这部分吗?

0 投票
2 回答
2722 浏览

java - 合成方法的惩罚是什么?

在 Eclipse 下开发 Java 应用程序时,我收到有关“通过合成方法访问的方法/值”的警告。解决方案只是将私有访问修饰符更改为默认级别。

这让我想知道:使用合成方法的惩罚是什么?有一些?我假设编译器/Eclipse 发出警告,但它是如此相关或可以安全忽略的东西?

我在这里没有看到这个信息,所以我在问。

0 投票
2 回答
4088 浏览

java - 如何使用内联匿名类声明避免合成访问编译器警告,这是什么意思?

我有以下代码:

我在 Eclipse 中的编译器抱怨说

Access to enclosing method 'someMethod' from type SomeClass is emulated by a synthetic accessor method.

谁能准确解释

  1. 这意味着什么,
  2. 如果我保持原样(因为它只是一个警告),可能的后果可能意味着什么,以及
  3. 我该如何解决?

谢谢

0 投票
1 回答
382 浏览

java - 枚举实例是否“封闭”在 java 中的枚举类型中?

复制器:

发出警告:

从类型 ID 访问封闭方法 w() 由合成访问器方法模拟

我了解合成方法是什么——我没有得到的是它们如何与枚举一起发挥作用——我希望枚举实例具有我在枚举中定义的所有私有方法。实例真的是嵌套类吗?

0 投票
2 回答
241 浏览

java - 成员类(内部类)如何访问外部类的实例变量?

我在下面编写了运行良好的代码,但我对合成方法有一个疑问。因为这些是为了访问私有数据而生成的。但我有在成员类中使用的外部类的公共实例变量,所以为了访问实例变量,它创建了合成方法(因为它在类文件中!!)。

代码片段如下:

类文件生成如下。 对于内部类 A 作为 TestInnerClass$A:

为 TestInnerClass 生成类文件:

所以我的疑问是:

1)。为什么显示方法在类文件中有不同的定义?

2)。为什么在 TestInnerClass 类文件中的实例变量被访问为TestInnerClass.this.x。但是相同的代码在 TestInnerClass$A 的类文件中与this.this$0.x 不同

3)为什么JVM创建合成方法this$0,但是实例变量是公共的

0 投票
1 回答
727 浏览

java - SonarQube 无法分析文件:桥接方法未标记为合成

在使用 SonarQube 分析项目时,我遇到了这个异常(该项目使用 JavaFX、Spring、AOP 和编译时编织)。我正在使用 maven 插件来运行分析 sonar:sonar 但我在使用 Jenkins 插件时遇到了同样的错误。我在与 maven 的反应器插件一起使用的超级 pom 上运行声纳插件。我的解决方案是什么?