現在実行中のメソッドの名前を取得する


回答:


177

Thread.currentThread().getStackTrace()通常、呼び出し元のメソッドが含まれますが、落とし穴があります(Javadocを参照)。

一部の仮想マシンは、状況によっては、スタックトレースから1つ以上のスタックフレームを省略します。極端な場合、このスレッドに関するスタックトレース情報を持たない仮想マシンは、このメソッドから長さ0の配列を返すことが許可されます。


7
これと同じ落とし穴は、例外のスタックトレースにも当てはまりますか?
ネイトパーソンズ

8
はい、そうです。のドキュメントのThrowable [getStackTraceメソッドは、()](。download.oracle.com/javase/1.5.0/docs/api/java/lang/...は正確に同じ段落が含まれています。
ボム

4
根本的なことは、JVMがスタックトレースを提供できる必要はないが、HotSpotを非常に信頼できるものにするために多くの作業が行われたことです。ただし、コードが特定のJVMの動作に依存しないようにする場合は、知っておく必要があります。
するThorbjörnRavnアンデルセン

以下のAlexsmailのバージョンはスタックトレースを作成せず、名前だけでなく実際のメソッドオブジェクトへのアクセスを提供します(戻り値の型も確認できます)。ベンチマークはしていませんが、スタックトレースは高価になる傾向があるため、彼の方法もはるかに高速であると思います。
ガス

デヴィンの応答は、この質問に対してはるかに簡潔な答えを与えるようです。
risingTide 2016

310

技術的にはこれでうまくいきます...

String name = new Object(){}.getClass().getEnclosingMethod().getName();

ただし、新しい匿名内部クラスはコンパイル時に作成されます(例:)YourClass$1.class。したがって、これにより、.classこのトリックを展開する各メソッドのファイルが作成されます。さらに、それ以外の場合は未使用のオブジェクトインスタンスが、実行時の呼び出しごとに作成されます。したがって、これは許容できるデバッグトリックかもしれませんが、かなりのオーバーヘッドが伴います。

このトリックの利点は、あるgetEncosingMethod()リターンjava.lang.reflect.Method注釈やパラメータ名を含む、方法の他のすべての情報を取得するために使用することができます。これにより、同じ名前の特定のメソッドを区別できます(メソッドオーバーロード)。

getEnclosingMethod()このトリックのJavaDocによると、SecurityException内部クラスは同じクラスローダーを使用してロードする必要があるため、をスローしないでください。したがって、セキュリティマネージャーが存在する場合でも、アクセス条件を確認する必要はありません。

getEnclosingConstructor()コンストラクターに使用する必要があります。(名前付き)メソッド外のブロック中、getEnclosingMethod()返しますnull


9
これは、現在実行中のメソッドを提供しません。これにより、匿名/ローカルクラスが定義されたメソッドが提供されます。- docs.oracle.com/javase/6/docs/api/java/lang/...
shrini1000

7
クラス{}; 文字列名= Local.class.getEnclosingMethod()。getName();
alexsmail 2013年

21
@ shrini1000アイデアは、情報が必要な場所でこのスニペットを使用することであり、ライブラリルーチンに入れないことです。
–ThorbjørnRavn Andersen 2013

4
ヒントをありがとう!新しいオブジェクトを作成する代わりに、this.getClass()。getEnclosingMethod()。getName();を使用してください。
リロ2015年

3
@Liloが正しくありません。getEnclosingMethodクラスが定義されているメソッドの名前を取得します。this.getClass()まったくあなたを助けません。@wutzebaerなぜあなたもする必要がありますか?あなたはすでにそれらにアクセスできます。
Hazel Troost 2017

134

2009年1月:
完全なコードは次のようになります(@Bombeの警告を念頭に置いて使用します):

/**
 * Get the method name for a depth in call stack. <br />
 * Utility function
 * @param depth depth in the call stack (0 means current method, 1 means call method, ...)
 * @return method name
 */
public static String getMethodName(final int depth)
{
  final StackTraceElement[] ste = Thread.currentThread().getStackTrace();

  //System. out.println(ste[ste.length-depth].getClassName()+"#"+ste[ste.length-depth].getMethodName());
  // return ste[ste.length - depth].getMethodName();  //Wrong, fails for depth = 0
  return ste[ste.length - 1 - depth].getMethodName(); //Thank you Tom Tresansky
}

この質問の詳細。

2011年12月の更新:

青みがかったコメント:

JRE 6を使用していますが、メソッド名が間違っています。
私が書けばうまくいくste[2 + depth].getMethodName().

  • 0getStackTrace()
  • 1でありgetMethodName(int depth)
  • 2 メソッドを呼び出しています。

virgo47回答(賛成)は、メソッド名を取得するために適用する適切なインデックスを実際に計算します。


2
私にとっては「メイン」とだけ書かれています。:-/
ファルケン教授の契約が

@Amigable:StackTraceElementデバッグ目的でall 配列を出力して、「main」が実際に正しい方法であるかどうかを確認しようとしましたか?
VonC、2011年

7
JRE 6を使用していますが、メソッド名が間違っています。書けば動作しますste[2 + depth].getMethodName()。0はgetStackTrace()、1はgetMethodName(int depth)、2はメソッドを呼び出します。@ virgo47の回答も参照してください。
青みがかった

2
@青みがかった:良い点。私はあなたのコメントとvirgo47の回答への参照を私の中に含めました。
VonC、2011

@VonCこの実装は本当に正しいですか?現在のメソッドを提供するには、ここでの深さはste.length + 1でなければなりません。depth = 0を許可する場合、ste [depth + 1]にすべきではありませんか?
mmm

85

このコードを使用して、スタックトレースインデックスの潜在的な変動を緩和しました。今はmethodName utilを呼び出すだけです。

public class MethodNameTest {
    private static final int CLIENT_CODE_STACK_INDEX;

    static {
        // Finds out the index of "this code" in the returned stack trace - funny but it differs in JDK 1.5 and 1.6
        int i = 0;
        for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
            i++;
            if (ste.getClassName().equals(MethodNameTest.class.getName())) {
                break;
            }
        }
        CLIENT_CODE_STACK_INDEX = i;
    }

    public static void main(String[] args) {
        System.out.println("methodName() = " + methodName());
        System.out.println("CLIENT_CODE_STACK_INDEX = " + CLIENT_CODE_STACK_INDEX);
    }

    public static String methodName() {
        return Thread.currentThread().getStackTrace()[CLIENT_CODE_STACK_INDEX].getMethodName();
    }
}

過剰に設計されているようですが、JDK 1.5にはいくつかの固定数があり、JDK 1.6に移行したときに変更されたことに少し驚いていました。今ではJava 6/7でも同じですが、あなたは決して知りません。実行時にそのインデックスが変更されることを証明するものではありませんが、HotSpotがそれほどうまく機能しないことを願っています。:-)


1
これはまだ微妙にベンダーに依存しています。JVMは、このコードの信頼できるデータを提供する必要はありません。
–ThorbjørnRavn Andersen 2013

6
JVM仕様によれば、JVMは完全なスタックトレース(最適化、インライン化など)を提供する必要はなく、ヒューリスティックがOracle Java 5とOracle Java 6の間で変更されていることがすでにわかっています。他のJVMがコードで期待どおりに動作するため、ベンダー固有の動作に微妙に依存しています。あなたがそれを認識している限り、それは完全に問題ありませんが、たとえば-IBM JVM(私たちがしなければならない)またはZingインスタンスにデプロイする必要がある場合、ヒューリスティックを再検討する必要があるかもしれません。
–ThorbjørnRavn Andersen 2013

1
これは、ここに示されているすべてのオプションの中で最も信頼性が高いようですが、依存関係があります。
イアン

46
 public class SomeClass {
   public void foo(){
      class Local {};
      String name = Local.class.getEnclosingMethod().getName();
   }
 }

名前の値はfooです。


5
Local.class.getEnclosingMethod()はnullでした。jdk1.6.0_31、1.2.5をプレイ
eigil

@eigilは興味深いですが、詳細情報がないと、何が「間違っている」のか、または何を期待すべきかを判断するのは困難ですnull
Maarten Bodewes

これはこの答えと同じトリックです。これは、偽のオブジェクトインスタンスを作成しないという利点があり、ステートメント内にインライン化できないクラス宣言を必要とするという欠点があります(通常、追加のコード行が必要です)。
Maarten Bodewes 2014

@eigilは、クラス(例:SomeClass)内、またはメソッド(例:foo)内でクラスを定義しましたか?メソッドまたはコンストラクターでラップせずにサブクラスを定義すると、getEnclosingMethod()がnullを返すことがわかりました。
DN

私がこの回答で説明したとおりに正確に実行したことを確認してください。プレイフレームワークでは奇妙なことだと思います。「通常の」Javaで問題なくテストされました。
eigil 2015年

36

これらのオプションはどちらも、Javaで動作します。

new Object(){}.getClass().getEnclosingMethod().getName()

または:

Thread.currentThread().getStackTrace()[1].getMethodName()

1
静的メソッドの使用:<Class> .class.getEnclosingMethod()。getName()
jellobird

Bombeの回答とjavadocの指示に従って、空の配列に注意してください。一部のJVMはスタックトレース配列を満たさない場合がありますか?
el-teedee 2018

34

私が見つけた最速の方法はそれです:

import java.lang.reflect.Method;

public class TraceHelper {
    // save it static to have it available on every call
    private static Method m;

    static {
        try {
            m = Throwable.class.getDeclaredMethod("getStackTraceElement",
                    int.class);
            m.setAccessible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String getMethodName(final int depth) {
        try {
            StackTraceElement element = (StackTraceElement) m.invoke(
                    new Throwable(), depth + 1);
            return element.getMethodName();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

ネイティブメソッドgetStackTraceElement(int depth)に直接アクセスします。アクセス可能なメソッドを静的変数に格納します。


3
パフォーマンスに関しては最速?この主張を裏付けるマイクロベンチマークはありますか?
Ibrahim Arief 2012

10
+1。1.6で単純なタイミングループを使用すると、この方法を使用した1,000,000回の反復には1219ミリ秒かかりましたが、使用するとnew Throwable().getStackTrace()5614ミリ秒かかりました。
2013年

1
m.setAccessible(true); AccessController.doPrivilegedで囲む必要があります。検討すべきこと、難しいルールではない
avanderw

6
2016年にテストされ、これが最速です。@achと同様に、100万回の反復を使用しました。1.7_79:1.6秒vs 15.2秒1.8_74:1.8秒vs 16.0秒 FWIW私のベンチマークste配列の長さ== 23ですが、この方法はスタックの深さに関係なく高速のままです。
Ryan

25

次のコードを使用します。

    StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace();
    StackTraceElement e = stacktrace[1];//coz 0th will be getStackTrace so 1st
    String methodName = e.getMethodName();
    System.out.println(methodName);

2
これは「getStackTrace」を出力します-私はJava 1.5を使用しています
Zack Macomber

Bombeの回答とjavadocの指示に従って、空の配列に注意してください。一部のJVMはスタックトレース配列を満たさない場合がありますか?
el-teedee 2018

16
public static String getCurrentMethodName() {
        return Thread.currentThread().getStackTrace()[2].getClassName() + "." + Thread.currentThread().getStackTrace()[2].getMethodName();
    }

はい、断然最高です...それをメソッドに変換して、トレース内の3番目の([2])フレーム(またはそれが呼び出されたもの)を取得します。
マイクげっ歯類

14

これは、virgo47の回答(上記)を拡張したものです

これは、現在および起動中のクラス/メソッド名を取得するためのいくつかの静的メソッドを提供します。

/* Utility class: Getting the name of the current executing method 
 * /programming/442747/getting-the-name-of-the-current-executing-method
 * 
 * Provides: 
 * 
 *      getCurrentClassName()
 *      getCurrentMethodName()
 *      getCurrentFileName()
 * 
 *      getInvokingClassName()
 *      getInvokingMethodName()
 *      getInvokingFileName()
 *
 * Nb. Using StackTrace's to get this info is expensive. There are more optimised ways to obtain
 * method names. See other stackoverflow posts eg. /programming/421280/in-java-how-do-i-find-the-caller-of-a-method-using-stacktrace-or-reflection/2924426#2924426
 *
 * 29/09/2012 (lem) - added methods to return (1) fully qualified names and (2) invoking class/method names
 */
package com.stackoverflow.util;

public class StackTraceInfo
{
    /* (Lifted from virgo47's stackoverflow answer) */
    private static final int CLIENT_CODE_STACK_INDEX;

    static {
        // Finds out the index of "this code" in the returned stack trace - funny but it differs in JDK 1.5 and 1.6
        int i = 0;
        for (StackTraceElement ste: Thread.currentThread().getStackTrace())
        {
            i++;
            if (ste.getClassName().equals(StackTraceInfo.class.getName()))
            {
                break;
            }
        }
        CLIENT_CODE_STACK_INDEX = i;
    }

    public static String getCurrentMethodName()
    {
        return getCurrentMethodName(1);     // making additional overloaded method call requires +1 offset
    }

    private static String getCurrentMethodName(int offset)
    {
        return Thread.currentThread().getStackTrace()[CLIENT_CODE_STACK_INDEX + offset].getMethodName();
    }

    public static String getCurrentClassName()
    {
        return getCurrentClassName(1);      // making additional overloaded method call requires +1 offset
    }

    private static String getCurrentClassName(int offset)
    {
    return Thread.currentThread().getStackTrace()[CLIENT_CODE_STACK_INDEX + offset].getClassName();
    }

    public static String getCurrentFileName()
    {
        return getCurrentFileName(1);     // making additional overloaded method call requires +1 offset
    }

    private static String getCurrentFileName(int offset)
    {
        String filename = Thread.currentThread().getStackTrace()[CLIENT_CODE_STACK_INDEX + offset].getFileName();
        int lineNumber = Thread.currentThread().getStackTrace()[CLIENT_CODE_STACK_INDEX + offset].getLineNumber();

        return filename + ":" + lineNumber;
    }

    public static String getInvokingMethodName()
    {
        return getInvokingMethodName(2); 
    }

    private static String getInvokingMethodName(int offset)
    {
        return getCurrentMethodName(offset + 1);    // re-uses getCurrentMethodName() with desired index
    }

    public static String getInvokingClassName()
    {
        return getInvokingClassName(2); 
    }

    private static String getInvokingClassName(int offset)
    {
        return getCurrentClassName(offset + 1);     // re-uses getCurrentClassName() with desired index
    }

    public static String getInvokingFileName()
    {
        return getInvokingFileName(2); 
    }

    private static String getInvokingFileName(int offset)
    {
        return getCurrentFileName(offset + 1);     // re-uses getCurrentFileName() with desired index
    }

    public static String getCurrentMethodNameFqn()
    {
        return getCurrentMethodNameFqn(1);
    }

    private static String getCurrentMethodNameFqn(int offset)
    {
        String currentClassName = getCurrentClassName(offset + 1);
        String currentMethodName = getCurrentMethodName(offset + 1);

        return currentClassName + "." + currentMethodName ;
    }

    public static String getCurrentFileNameFqn()
    {
        String CurrentMethodNameFqn = getCurrentMethodNameFqn(1);
        String currentFileName = getCurrentFileName(1);

        return CurrentMethodNameFqn + "(" + currentFileName + ")";
    }

    public static String getInvokingMethodNameFqn()
    {
        return getInvokingMethodNameFqn(2);
    }

    private static String getInvokingMethodNameFqn(int offset)
    {
        String invokingClassName = getInvokingClassName(offset + 1);
        String invokingMethodName = getInvokingMethodName(offset + 1);

        return invokingClassName + "." + invokingMethodName;
    }

    public static String getInvokingFileNameFqn()
    {
        String invokingMethodNameFqn = getInvokingMethodNameFqn(2);
        String invokingFileName = getInvokingFileName(2);

        return invokingMethodNameFqn + "(" + invokingFileName + ")";
    }
}

3
これを@mklemenzの回答と組み合わせると、スタック情報にアクセスするための非常に高速でクリーンな方法です。
Octavia Togami 2013

12

現在のメソッドを呼び出したメソッドの名前を取得するには、以下を使用できます。

new Exception("is not thrown").getStackTrace()[1].getMethodName()

これは私のMacBookと私のAndroidフォンで動作します

私も試しました:

Thread.currentThread().getStackTrace()[1]

しかし、Androidは「getStackTrace」を返します。

Thread.currentThread().getStackTrace()[2]

MacBookで間違った答えが出る


Androidでの最近のテストでは、を使用するgetStackTrace()[0]よりも、使用する方がうまくいきましたgetStackTrace()[1]。YMMV。
mbm29414 2016年

up for android isThread.currentThread().getStackTrace()[2]
Ninja

11

Util.java:

public static String getCurrentClassAndMethodNames() {
    final StackTraceElement e = Thread.currentThread().getStackTrace()[2];
    final String s = e.getClassName();
    return s.substring(s.lastIndexOf('.') + 1, s.length()) + "." + e.getMethodName();
}

SomeClass.java:

public class SomeClass {
    public static void main(String[] args) {
        System.out.println(Util.getCurrentClassAndMethodNames()); // output: SomeClass.main
    }
}

final StackTraceElement e = Thread.currentThread().getStackTrace()[2]; 動作します。e.getClassName();完全なクラス名とe.getMethodName()メソッド名を返します。
2015年

1
getStackTrace()[2]間違っている、それがなければならないgetStackTrace()[3]ので、[0] dalvik.system.VMStack.getThreadStackTrace [1] java.lang.Thread.getStackTrace [2] Utils.getCurrentClassAndMethodNames [3]機能()は、このいずれかを呼び出す
PhilLab

11

これはStackWalkerJava 9以降を使用して行うことができます。

public static String getCurrentMethodName() {
    return StackWalker.getInstance()
                      .walk(s -> s.skip(1).findFirst())
                      .get()
                      .getMethodName();
}

public static String getCallerMethodName() {
    return StackWalker.getInstance()
                      .walk(s -> s.skip(2).findFirst())
                      .get()
                      .getMethodName();
}

StackWalkerは遅延するように設計されているため、たとえば、Thread.getStackTraceコールスタック全体の配列を熱心に作成するよりも効率的です。詳細については、JEPも参照してください。


5

別の方法は、例外を作成するがスローしないで、スタックトレースデータを取得するためにそのオブジェクトを使用することです。これは、囲んでいるメソッドが通常はインデックス0にあるためです。上記の通り。ただし、これは最も安価な方法ではありません。

Throwable.getStackTrace()から(これは少なくともJava 5以降同じです):

配列の0番目の要素(配列の長さが0でない場合)は、スタックの最上位を表します。これは、シーケンスの最後のメソッド呼び出しです。通常、これは、このスロー可能オブジェクトが作成されてスローされたポイントです。

以下のスニペットは、クラスが静的でない(getClass()のため)と想定していますが、それはさておきます。

System.out.printf("Class %s.%s\n", getClass().getName(), new Exception("is not thrown").getStackTrace()[0].getMethodName());

4
String methodName =Thread.currentThread().getStackTrace()[1].getMethodName();
System.out.println("methodName = " + methodName);

1
上記のmvanle virgo47の回答とthorbjorn-ravn-andersenのコメントをご覧ください。繰り返し、不正確、信頼性の低いコード。
alexsmail 2013

@ShivaKomuravellyはい、しかしどのような状況でもそうではないので、私も-1です。
Maarten Bodewes 2014

3

これを使用して解決策があります(Androidの場合)

/**
 * @param className       fully qualified className
 *                        <br/>
 *                        <code>YourClassName.class.getName();</code>
 *                        <br/><br/>
 * @param classSimpleName simpleClassName
 *                        <br/>
 *                        <code>YourClassName.class.getSimpleName();</code>
 *                        <br/><br/>
 */
public static void getStackTrace(final String className, final String classSimpleName) {
    final StackTraceElement[] steArray = Thread.currentThread().getStackTrace();
    int index = 0;
    for (StackTraceElement ste : steArray) {
        if (ste.getClassName().equals(className)) {
            break;
        }
        index++;
    }
    if (index >= steArray.length) {
        // Little Hacky
        Log.w(classSimpleName, Arrays.toString(new String[]{steArray[3].getMethodName(), String.valueOf(steArray[3].getLineNumber())}));
    } else {
        // Legitimate
        Log.w(classSimpleName, Arrays.toString(new String[]{steArray[index].getMethodName(), String.valueOf(steArray[index].getLineNumber())}));
    }
}

3

現在実行されているメソッドの名前を取得する目的は何なのかわかりませんが、それがデバッグ目的だけの場合は、「logback」などのロギングフレームワークが役立ちます。たとえば、logbackでは、ログ構成でパターン "%M"使用するだけです。ただし、これはパフォーマンスを低下させる可能性があるため、注意して使用する必要があります。


2

念のためにあなたが知りたい名前メソッドは、JUnitテストメソッドがあり、その後、あなたはのJUnitテスト名規則を使用することができます。https://stackoverflow.com/a/1426730/3076107


1
@AndreiKonstantinovこれはリンクのみだとは思いません。リンクを削除しても、少なくともいくつかの情報があります。
EJoshuaS-モニカを

1

ここでのほとんどの答えは間違っているようです。

    public static String getCurrentMethod() {
            return getCurrentMethod(1);
    }
    public static String getCurrentMethod(int skip) {
            return Thread.currentThread().getStackTrace()[1 + 1 + skip].getMethodName();
    }

例:

    public static void main(String[] args) {
            aaa();
    }

    public static void aaa() {
            System.out.println("aaa  -> "  + getCurrentMethod( ) );
            System.out.println("aaa  -> "  + getCurrentMethod(0) );
            System.out.println("main -> "  + getCurrentMethod(1) );
    }

出力:

aaa  -> aaa
aaa  -> aaa
main -> main

有益な回答をありがとう。
AmerllicA

ほとんどの回答があなたにとって間違っていると思われる理由を明確にしていただけませんか?答えはたくさんありますが、私はJavaに精通していないため、すべてを読んで、それらとあなたの答えの違いを理解することはできません。:(
Xobotun

@mmm申し訳ありませんが、私は強く同意しません。私は学ぶためにここに来て、他にも多くのことをやっていると思います。なぜ私はこの問題についてもっと知るに値しないと思うのか理解できません。私は自分のコードの間違いを減らし、他のカーゴカルトをフォローするのではなく、他の人に警告したいです。少なくとも、このコードが正しいJavaバージョンを明確にすることができます。:(以下の回答は、1.5と1.6の間でスタックトレースに変更があったことを示しています。たぶん、あなたは次のJava 14にそのような何かがあることを示唆しているかもしれません。どうすれば私は知ることができますか。または、異なるベンダーが持っているかもしれません。 1つ
Xobotun

0

maklemenzの答えを少し書き直した。

private static Method m;

static {
    try {
        m = Throwable.class.getDeclaredMethod(
            "getStackTraceElement",
            int.class
        );
    }
    catch (final NoSuchMethodException e) {
        throw new NoSuchMethodUncheckedException(e);
    }
    catch (final SecurityException e) {
        throw new SecurityUncheckedException(e);
    }
}


public static String getMethodName(int depth) {
    StackTraceElement element;

    final boolean accessible = m.isAccessible();
    m.setAccessible(true);

    try {
        element = (StackTraceElement) m.invoke(new Throwable(), 1 + depth);
    }
    catch (final IllegalAccessException e) {
        throw new IllegalAccessUncheckedException(e);
    }
    catch (final InvocationTargetException e) {
        throw new InvocationTargetUncheckedException(e);
    }
    finally {
        m.setAccessible(accessible);
    }

    return element.getMethodName();
}

public static String getMethodName() {
    return getMethodName(1);
}

-2
MethodHandles.lookup().lookupClass().getEnclosingMethod().getName();

11
詳細を編集してください。コードのみの回答と「これを試す」の回答は、検索可能なコンテンツが含まれておらず、誰かが「これを試す」必要がある理由を説明していないため、お勧めしません。
abarisone

1
このコードは問題の解決に役立つ可能性がありますが、なぜまたはどのように質問に答えるは説明していません。この追加のコンテキストを提供すると、その長期的な教育的価値が大幅に向上します。回答を編集して、適用される制限や前提条件などの説明を追加してください。
Toby Speight 2016

1
Java 7以降のみ。ただし、メソッド名を取得する簡潔な方法。それでも、このような呼び出しのパフォーマンスに関する考慮事項は残っています。
ベンジ

6
getEnclosingMethod()NullPointerExceptionJava 7でa をスローします
Markus L

2
java.lang.Class.getEnclosingMethod()は、このClassオブジェクトがメソッド内のローカルクラスまたは匿名クラスを表す場合は、基になるクラスを直接囲むメソッドを表すMethodオブジェクトを返し、そうでない場合はnullを返します。
ストーブ

-5

このアプローチの何が問題になっています:

class Example {
    FileOutputStream fileOutputStream;

    public Example() {
        //System.out.println("Example.Example()");

        debug("Example.Example()",false); // toggle

        try {
            fileOutputStream = new FileOutputStream("debug.txt");
        } catch (Exception exception) {
             debug(exception + Calendar.getInstance().getTime());
        }
    }

    private boolean was911AnInsideJob() {
        System.out.println("Example.was911AnInsideJob()");
        return true;
    }

    public boolean shouldGWBushBeImpeached(){
        System.out.println("Example.shouldGWBushBeImpeached()");
        return true;
    }

    public void setPunishment(int yearsInJail){
        debug("Server.setPunishment(int yearsInJail=" + yearsInJail + ")",true);
    }
}

そして、人々がSystem.out.println(...)あなたを使うことに夢中になる前に、あなたはいつでも、そしてそうすべきです、出力をリダイレクトできるようにいくつかのメソッドを作成します、例えば:

    private void debug (Object object) {
        debug(object,true);
    }

    private void dedub(Object object, boolean debug) {
        if (debug) {
            System.out.println(object);

            // you can also write to a file but make sure the output stream
            // ISN'T opened every time debug(Object object) is called

            fileOutputStream.write(object.toString().getBytes());
        }
    }

4
@Sakshamそれは私にそれが実際に質問に答える試みであったように私に見えます。すばらしい試みではありませんが、それでもなお試みられます。
ivarni 2014

@ivarni「良い試みではない」?どうしたの?あなたは「キスの原則」を知っていますか?
ジョニー2014

@Sakshamそれは修辞的でした。
ジョニー2014

5
@johnny私の目の前にあるコードベースには、271のクラスがあります。クラスごとに(推定値が低い)og 5メソッドでさえ、1300メソッドを超えています。そして、これは大きなコードベースでもありません。アプローチのスケールアップに問題がありませんか?私は同意しないことに同意してとても嬉しいですが、それが私がそれが良い試みではないと言った理由です。これは、重要なコードベースに大量のオーバーヘッドをもたらします。
ivarni 2014

1
@johnnyデバッグ時に間違った方向に送られてきた文字列とメソッド名が一致しないケースが多すぎると思います。しかし、Javaでは私はまだあなたの提案が最良だと思います。他の選択肢は「コスト」が高すぎます。
ちょうど別のメタプログラマー2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.