問題タブ [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.
java - Javaのプライベート静的ネストクラスの合成アクセサーに関するEclipseの警告?
私の同僚は、Eclipseのコードフォーマットと警告の設定のいくつかをより厳密にすることを提案しました。これらの変更の大部分は理にかなっていますが、Javaでこの1つの奇妙な警告が表示されます。「問題」を再現するためのテストコードは次のとおりです。
!!!とのライン 新しい警告設定を使用して、Eclipseでこの警告が表示されます。
囲んでいるコンストラクターWeirdInnerClassJavaWarning.InnerClass()へのアクセスは、合成アクセサーメソッドによってエミュレートされます。可視性を高めると、パフォーマンスが向上します。
これは何を意味するのでしょうか?「プライベート静的クラス」を「保護された静的クラス」に変更すると、警告が消えます。これは私には意味がありません。
編集:私はついに「正しい」修正を見つけました。ここでの本当の問題は、このネストされたプライベート静的クラスにパブリックコンストラクターがないことです。その1つの調整により、警告が削除されました。
クラスをプライベートのネストされたクラスにし(したがって、囲んでいるクラスのサブクラスを含め、他のクラスがそのクラスにアクセスできないようにします)、静的クラスにします。
ネストされたクラスをプライベートではなく保護することが「問題」を修正する別の方法である理由はまだわかりませんが、それはEclipseの癖/バグかもしれません。
(申し訳ありませんが、より明確にするために、InnerClassではなくNestedClassと呼ぶべきでした。)
java - 合成法の意義は何ですか?
問題
ある友人が興味深い問題を提案しました。次のコードがあるとします。
外部クラスから、message
変数の内容を出力するにはどうすればよいですか? もちろん、メソッドやフィールドのアクセシビリティを変更することは許可されていません。
(ソースはこちら、フランスのブログです)
解決
この問題を解決するコードは次のとおりです。
メソッド名は実際には標準的ではないことに注意してくださいaccess$000
(この形式が強く推奨される形式であっても)、一部の JVM はこのメソッドに名前を付けますaccess$0
。したがって、より良い解決策は、合成メソッドを確認することです。
したがって、この問題の興味深い点は、合成法の使用を強調することです。これらのメソッドを使用すると、ソリューションで行ったようにプライベート フィールドにアクセスできます。もちろん、リフレクションを使う必要がありますし、こういう使い方はかなり危険だと思いますが…
質問
開発者としての私にとって、合成メソッドの関心は何ですか? 合成繊維の使用が役立つ場合、どのような状況が考えられますか?
java - プライベート フィールド用に生成された合成メソッドは、実際にパフォーマンスの低下を招きますか?
Eclipse では、private フィールドが内部クラスからアクセスされると、合成アクセサー メソッドが生成され、フィールドを package-private にすることでパフォーマンスが向上する可能性があることを示すオプションの警告があります。
この合成メソッドは本当にパフォーマンスの低下を招きますか? アクセサーは一般的に実行時にインライン化されると思いましたね。
java - 合成アクセサメソッドの警告
Eclipseでいくつかの新しい警告設定を行いました。これらの新しい設定で、私は奇妙な警告に直面しています。読んだ後、私はそれが何であるかを知るようになりましたが、それを削除する方法を見つけることができませんでした。
これがサンプルコードに関する私の問題です
* *の行は、Eclipseで警告を表示します
問題は、のアクセス修飾子を変更したくないということですtestString
。また、そのためのゲッターを作成したくありません。
どのような変更を行う必要がありますか?
の行**
は私に同じ警告を与えます。
java - 「静的合成」の意味は何ですか?
私はJavaバイトコードから取得したいくつかの分解されたコードを見ています。私は次のようにいくつかの宣言を見ます:
synthetic
またはのaccess$0
意味がわかりません。誰かが私がこの部分を理解するのを手伝ってくれますか?
java - 合成メソッドのペナルティは何ですか?
EclipseでJavaアプリケーションを開発しているときに、「合成メソッドを介してアクセスされるメソッド/値」に関する警告が表示されました。解決策は、プライベートアクセス修飾子をデフォルトレベルに変更するだけでした。
それは私に疑問を残しました:合成法を使用することのペナルティは何ですか?いくつかありますか?コンパイラー/Eclipseが警告を出すのでそうだと思いますが、それは非常に関連性のあるものですか、それとも安全に無視できるものですか?
この辺りでこの情報を見たことがないので、お願いします。
java - インライン匿名クラス宣言で合成アクセスコンパイラの警告を回避するにはどうすればよいですか?それはどういう意味ですか?
次のコードがあります。
私のEclipseのコンパイラは、
Access to enclosing method 'someMethod' from type SomeClass is emulated by a synthetic accessor method.
誰か正確に説明してくれませんか
- これが何を意味するか、
- そのままにしておくと(警告にすぎないため)、考えられる影響が何を意味するのか、および
- どうすれば修正できますか?
ありがとう
java - 列挙型インスタンスはJavaの列挙型に「囲まれています」か?
再生器 :
警告が発せられました:
型 ID からのエンクロージング メソッド w() へのアクセスは、合成アクセサー メソッドによってエミュレートされます。
私は合成メソッドとは何かを理解しています - 私が得ていないのは、それらが列挙型でどのように機能するかです - 列挙型インスタンスには、列挙型で定義したすべてのプライベートメソッドがあると期待しています。インスタンスは本当にネストされたクラスですか?
java - メンバークラス(内部クラス)は外部クラスのインスタンス変数にどのようにアクセスしていますか?
以下のコードは正常に動作していますが、合成法について 1 つ疑問があります。これらは個人データにアクセスするために生成されます。しかし、私はメンバークラスで使用される外部クラスのパブリックインスタンス変数を持っているので、インスタンス変数にアクセスするために合成メソッドを作成しました(クラスファイルにあるように!!)。
コード スニペットは次のとおりです。
クラスファイルは以下のように生成されます。 TestInnerClass$A として内部クラス A の場合:
クラス ファイルが TestInnerClass 用に生成されます。
だから私の疑問は次のとおりです。
1)。表示方法がクラスファイルで異なる定義を持っているのはなぜですか??
2)。TestInnerClass クラス ファイルのインスタンス変数がTestInnerClass.this.xとしてアクセスされるのはなぜですか。しかし、TestInnerClass$A のクラス ファイルでは、同じコードがthis.this$0.x ??と異なります。
3) JVM が合成メソッドをthis$0として作成したのに、インスタンス変数が publicであるのはなぜですか??
java - SonarQube はファイルを分析できません: ブリッジ メソッドが合成としてマークされていません
SonarQube を使用してプロジェクトを分析すると、この例外が発生します (プロジェクトは JavaFX、Spring、AOP をコンパイル時のウィービングで使用します)。maven プラグインを使用して分析 sonar:sonar を実行していますが、Jenkins プラグインでも同じエラーが発生します。Mavenのリアクタープラグインで使用されるスーパーポンでソナープラグインを実行しています。私の解決策は何ですか?