問題タブ [class-visibility]
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.
c++ - c++ シンボルのエクスポート
私は、Linux、Windows、および osX の C++ ライブラリの開発者です。osX は匿名の例外を適切に処理しないようになったため、エクスポートする必要があるシンボルを明確にマークすることを検討しました。これらの説明に続いて、 2 つのマクロを定義しました:FOO_API
およびFOO_LOCAL
シンボルをマークするため。今、私は次の問題を抱えています:
各クラスを独自のファイルで定義します (1000 以上の長いファイルは必要ないため)。クラスA
がライブラリでのみ使用されている場合は、 でマークするのが理にかなっていFOO_LOCAL
ます。しかし、クラスB
にタイプ のプライベート メンバーがありA
、クラスB
がFOO_API
である場合、コンパイラの警告が表示され、リンクが失敗します (シンボルが見つかりません)。これは、これらのエクスポート属性の要点全体に反しているようです。それで、それはどうあるべきですか?class FOO_LOCAL A {...}
Is this right?のようなものでクラスをマークします。
すべてのプライベートメンバーをローカルにする方法もありませんか? (それらは非公開であるため、直接アクセスすることは想定されていません) これにより、マーキングプロセスが面倒ではなくなります...
最後に、たとえば例外クラスをマークすると、適切にコンパイルおよび実行されますが、シンボル ( nm -C -D my_lib.so
) を表示すると、すべてのシンボルがまだそこにあることがわかります...
java - リフレクションを介して別のパッケージ内のクラスでパブリック メソッドを呼び出す
次の問題に遭遇しました。
パッケージに 2 つの異なるパッケージがあり、a
パッケージ内のインターフェイスの実装されたメソッドを呼び出したいのですb
が、実装するクラスにはパッケージの可視性があります。
したがって、単純化されたコードは次のようになります。
そして呼び出し元:
プログラムを開始すると、パッケージの可視性が検出されたメソッドの呼び出しを禁止しているため、期待どおりに出力さCalled
れ、例外がスローされます。
だから私の質問は、この問題を解決する方法はありますか? 私はJavaドキュメントに何か欠けているのでしょうか、それとも単純に実装されたメソッドをリフレクションなしで呼び出すことは可能ですが、これは単に不可能です.
php - Symfony1で別のアクションからアクションをレンダリングする方法
現時点ではアップグレードできないバージョン1.0.17を使用しているSymfonyアプリケーションで立ち往生しています。
現在、同じモジュールから異なるアクションのWebページをロードするiframeを含むページがあります。iframeは、いくつかのデザインの問題といくつかのユーザーエクスペリエンスの問題を引き起こしているので、それを取り除き、iframeからHTMLをページに直接レンダリングしたいと思います。
別のアクションを実行して、ビューテンプレートを呼び出し元のアクションのビューに割り当てることができる変数にレンダリングする方法がわかりません。
試しましgetPresentationFor()
たが、呼び出しページで404が発生し、試行方法に応じて例外または致命的なエラーが発生します。
execute
アクションのメソッドにコードを入れる必要があると思います。コントローラはsfAction
オブジェクトです。電話をかける$this->getController()
とsfWebController
オブジェクトが表示されます。
呼び出し:
空白のページになります。その呼び出しの後のコードは実行されませんが、それより前に何かを出力すると、ページに表示されます。サーバーエラーログにエラーはありません。
呼び出し:
404ページが表示されるだけなので、前の呼び出しは私が望むものに近いと思います。
別のアクションのコードから別のアクションの出力をレンダリングする方法はありますか?
ありがとう。
java - パッケージ ローカル クラスの Classliteral と Class.forName の異なる動作
例としてClassFileAssembler
、sun.reflect
パッケージのクラスを考えてみましょう。
このクラスはパッケージ ローカル クラスです。
class ClassFileAssembler implements sun.reflect.ClassFileConstants {...
そのため、名前でさえ使用ClassFileAssembler
できず、直接インポートすることはできません。コンパイル エラーが発生します。
ただしsun.reflect
、プロジェクトでという名前のパッケージを作成し、そのClassFileAssembler
名前をこのパッケージ内で内部的に使用することはできます。Java コンパイラは、私たちがClassFileAssembler
のパッケージ内にいると認識します。
もしそうなら、なぜクラスオブジェクトへの参照を取得しようとしないのClassFileAssembler.class
ですか?
Class<ClassFileAssembler> classFileAssemblerClass = ClassFileAssembler.class;
予期せず、このコードは実行時エラーを引き起こします: java.lang.IllegalAccessError: tried to access class sun.reflect.ClassFileAssembler from class sun.reflect.Test
.
ClassFileAssembler
ただし、クラス オブジェクトを取得することはできます。
これは問題なく動作し、完全なクラスの説明が得られます。
したがって、質問は次のとおりです。
1) テクニックの違いは何ですか?Class.forName0
クラスオブジェクトへの参照を取得する方法とその方法.class
は?
2) なぜこのようにセキュリティチェックが異なるのですか?
.class
3)参照をそのように保護する理由は何ですか?
4) これらの手法は異なるクラスローダーを使用していますか?
php - PHPはパブリックメソッドの呼び出しを制限します
私は、中央のクラスによってすべてまとめられたかなりの数のクラスがあるライブラリに取り組んでいます。この中央クラスは、セットアップ/構成の目的で、他のクラスの特定のメソッドを呼び出す必要があります。これらのメソッドは、中央クラスが呼び出すことができるようにパブリックである必要がありますが、ユーザーにこれらのメソッドを呼び出させたくありません(望ましくない動作を引き起こす可能性があるため)。
私の友人が行った提案の1つは、パラメーターを使用してコンストラクターを使用し、構築時にセットアップを実行できるようにすることでした。このライブラリの目的では、それは簡単には不可能です。問題のクラスは拡張することを目的としており、ユーザーが独自のコンストラクターを持ちたい場合は、コンストラクターパラメーターに奇妙な要件を課したくありませんでした。さらに複雑なのは、構成に使用される情報の一部がユーザーに利用できないことです。ユーザーが利用できるようにし、構築中に適切なクラスにルーティングすることを信頼する必要があります。
現在、私の解決策は、これらのメソッドに何かをプレフィックスとして付け、そのプレフィックスを付けてメソッドを呼び出さないようにユーザーに注意することです。これは、より制限されたメソッドを追加できるほど「柔軟」ですが、それでもユーザーが私の指示に従うことを前提としています。また、これは最も洗練されたソリューションではありません。
これらの方法を簡単に制限する方法があるのではないかと思いました。それらを呼び出す中央クラスであるかどうかをチェックする行をそれらに追加することを考えましたが、それも最善の解決策ではないようです。
編集:このアーキテクチャの目的を説明する必要があります。クラスはそれぞれ、一連の操作で特定のタスクを実行します。中央クラスの仕事は、1つのクラスにそのタスクを実行し、結果を収集し、結果を必要とする他のクラスに分散するように命令することです。次に、クラスは次のクラスに移動し、同じことを行います。タスクの実行方法は、拡張クラス次第です。私が制限したい方法は、結果の分散を助ける方法です。それが私の意図をより明確にすることを願っています。
php - PHPの親クラスからメソッドを呼び出しますか?
insertValue()
;というメソッドを呼び出す方法がわからないようです。
私のブートストラップはURLを取得して分割するため、www.URL.com / register/registerは次のようになります。
モデルクラスは次のとおりです。
したがって、データベースクラスは次のようになります。
これで、コントローラーを次のように拡張するレジスタクラスを作成するブートストラップができました。
Register->loadModel();
ブートストラップは、次のように単純に次のように言うことで、モデルクラスも作成します。
insertValue関数を呼び出す方法がまったくわかりません。試し$this->model->database->insertValue();
ましたが、うまくいきませんでした。
PSこの関数を呼び出すと、その下のコードは呼び出されませんが、エラーメッセージは表示されません。
c# - 内部型(C#)でパブリッククラスメソッドを宣言する際の一貫性のないアクセシビリティエラー?
内部クラスである JSON クラス オブジェクトがあります。JSON デシリアライゼーション コードだけがそれを行うようにしたいので、他のコードがその型のオブジェクトを作成しようとするのを防ぐために、その方法を維持したいと思います。クラス型を変数として使用できますが、その型のオブジェクトを返そうとすると、メソッドがpublicでクラスがinternalであるため、一貫性のないアクセシビリティコンパイラ エラーが発生します。
この状況を解決する最善の方法は何ですか? 内部クラス用のインターフェースを作成してそれを渡すことができると思いますが、それは、使用しているすべての JSON クラスに対して余分な荷物を作成する必要があり、それらをたくさん使用していることを意味します。
編集: Jon Skeet によって提案された変更を行い、問題は解決しました。クラスをデフォルトで public と宣言する習慣があるため、この問題に陥りました。同じことをしている他の人のためにこれを指摘しています。