私は仕事中のプロジェクトに取り組んでおり、Swingコンポーネントがユーザーによって操作されるたびにイベントをファイルに記録するカスタムJavaSwingライブラリーの実装を任されています。つまり、ユーザーがGUIのボタンやチェックボックスなどを操作するたびに、イベントがファイルに記録されます。ログエントリには、イベントが発生したソースファイル名と行番号が含まれている必要があります。1つの落とし穴があります。ライブラリの外部で開発者によって実装されたメソッドのロギングメカニズムは、ライブラリ内で自動的に発生する必要があります。できますか?これが私がこれまでに持っているものです:
カスタムライブラリアクションリスナー:
public abstract class MyActionListener implements ActionListener
{
// Prevents the developer from implementing the "actionPerformed" method
@Override
public final void actionPerformed(ActionEvent e)
{
// Do nothing
}
// Custom method
public void actionPerformed(MyActionEvent e)
{
doCustomMethod();
// Tried obtaining the stack trace here but there's no entry
// in the trace for "doCustomMethod()"
StackTraceElement [] elements = Thread.currentThread().getStackTrace();
for (StackTraceElement element : elements)
{
// print each element
}
}
// Forces the developer to implement this method
public abstract void doCustomMethod();
}
カスタムライブラリボタン:
public class MyButton extends JButton
{
...
// Custom method
public void addActionListener(MyActionListener l)
{
listenerList.add(MyActionListener.class, l);
}
}
開発者が作成したGUI:
public class TestGui extends JFrame
{
TestGui()
{
...
MyButton button = new MyButton("Push");
button.addActionListener(new MyActionListener()
{
public void doCustomMethod()
{
// Want to log this line number and file name,
// but need the library to do it; NOT the developer.
}
});
}
}
正しいaddActionListener( )メソッドとactionPerformed()メソッドが呼び出されるように、適切なロジックがすべて用意されています。私の問題は、イベントをログに記録しようとしていることです。カスタムJavaアノテーションの実装も試みましたが、機能しませんでした。さらに、開発者はGUIの構築に-processorオプションを含める必要があります。開発者に、JavaSwingライブラリと同じようにカスタムSwingライブラリを使用してもらうようにしています。私が実装する変更は、開発者には透過的です。
どんな助けでも大歓迎です。