Javaリフレクション:カスタムAbstractProcessorでメソッドの使用法を見つける

ヘクター:

私は熟考の初心者です。特定のメソッドが呼び出された場所を検出する方法はありますか?例えば:

public class MyClass {

   public static void method(){ 
       //DO SOMETHING
   }

}

public class Test {

    public test(){
       MyClass.method();
    }

}

public class MyProcessor extends AbstractProcessor {

   public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {

      Method method = MyClass.class.getDeclaredMethod("method");

      Class classWhereMethodIsInvoked = obtainClassWhereMethodIsInvoked(method); 

   }

   public Class obtainClassWhereMethodIsInvoked(Method method) {
      //here I want to search one class that invoke that method, in this case Test.class
   }

}

このようなことは可能ですか、私は夢中になりますか?

ホセ・マルティネス:

はい、本当に必要な場合は実行できます。classLoaderを使用してクラスパスを検索し、すべてのクラスファイルでメソッド名をスキャンできます。以下は、実行可能であることを示す非常に単純な例です。以下の例では、このクラスで「println」メソッドが使用されています。基本的に、スコープを私の例の1つのファイルからすべてのクラスファイルに広げることができます。

public class SearchClasses {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws FileNotFoundException {


//      InputStream is = SearchClasses.class.getClassLoader().getResourceAsStream("resources.SearchClasses.class");
        InputStream is = new FileInputStream(new File("build/classes/resources/SearchClasses.class"));

        boolean found = false;
        Scanner scanner = new Scanner(is);
        while (scanner.hasNext()) {
            if (scanner.nextLine().contains("println")) {
                System.out.print("println found");
                found = true;
                break;
            }
        }

        if (!found) {
                System.out.print("println NOT found");          
        }

    }

    public static void testMethod() {
        System.out.println("testing");
    }

}

私のIDEでは、検索していたクラスファイルにアクセスするためにFileInputStreamを使用する必要がありましたが、jarファイルを検索している場合は、代わりにclassLoaderを使用できます。すべてのクラスパスを検索するメカニズムが必要になります。これは不可能ではありませんが、簡潔にするために残しました。

編集:これは完全に機能させるための試みです..クラスパス内のすべてのファイルでメソッドを検索します。

public class SearchClasses {

    /**
     * @param args the command line arguments
     * @throws java.io.FileNotFoundException
     */
    public static void main(String[] args) throws FileNotFoundException, IOException {

        printAllFileWithMethod("println");
    }

    public static void printAllFileWithMethod(String methodName) throws FileNotFoundException, IOException {
        Enumeration<URL> roots = SearchClasses.class.getClassLoader().getResources("");

        List<File> allClassFiles = new ArrayList<>();
        while (roots.hasMoreElements()) {
            File root = new File(roots.nextElement().getPath());
            allClassFiles.addAll(getFilesInDirectoryWithSuffix(root, "class"));
        }

        for (File classFile : allClassFiles) {
            InputStream is = new FileInputStream(classFile);

            boolean found = false;
            Scanner scanner = new Scanner(is);
            while (scanner.hasNext()) {
                if (scanner.nextLine().contains(methodName)) {
                    System.out.print(methodName + " found in " + classFile.getName() + "\n");
                    found = true;
                    break;
                }
            }

        }
    }

    public static void testMethod() {
        System.out.println("testing");
    }

    static List<File> getFilesInDirectoryWithSuffix(File dir, String suffix) {
        List<File> foundFiles = new ArrayList<>();
        if (!dir.isDirectory()) {
            return foundFiles;
        }
        for (File file : dir.listFiles()) {
            if (file.isDirectory()) {
                foundFiles.addAll(getFilesInDirectoryWithSuffix(file, suffix));
            } else {
                String name = file.getName();
                if (name.endsWith(suffix)) {
                    foundFiles.add(file);
                }
            }

        }
        return foundFiles;
    }

}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Java:リフレクションコードの使用法を見つける

分類Dev

スカッシュマイグレーションの使用法(「migration_name」を見つける方法)

分類Dev

Springコンテキストでメソッドレベルのカスタムアノテーションを見つける

分類Dev

リフレクションを使用して静的クラスでプライベート静的メソッドを見つける方法は?

分類Dev

スタックトレースまたはリフレクションを使用してメソッドの呼び出し元を見つけるにはどうすればよいですか?

分類Dev

リフレクションを使用して、現在実行中のメソッドの名前を見つけることができますか?

分類Dev

Javaアプリケーションでスレッド作成のソースを見つける

分類Dev

カスタムApplicationExceptionをキャッチするためのリフレクションを含むJava NegativeTestプライベートメソッド

分類Dev

ReSharper:オプションのパラメーターの使用法を見つける

分類Dev

アクションメソッドでクリックされたボタンを見つける方法

分類Dev

強く型付けされたリフレクションを使用して、ジェネリックパラメーターを持つメソッドを見つけることはできますか?

分類Dev

バッキングコレクションのメソッド/クラスの概要を見つける場所

分類Dev

ジェネリックスパラメーターと戻り値型メソッドを持つJavaでリフレクションを使用してクラスのインスタンスを取得する方法

分類Dev

ストレージAPIでHTTPバッチの使用法を見つける

分類Dev

IntelliJのクラスインスタンスでscalaapply関数の使用法を見つける方法は?

分類Dev

Xcodeでカスタムメソッドとプロパティの使用法のヒントを追加するにはどうすればよいですか?

分類Dev

KubernatesクラスターでServceAccountの使用法を見つける

分類Dev

AndroidStudioでXMLファイルの使用法を見つけるためのショートカットは何ですか?

分類Dev

Javaリフレクションを使用してメソッドの型付きリターンを取得する

分類Dev

カスタム属性を持つlaravelコレクションメソッド

分類Dev

Javaストリームを使用してコレクション内のBigDecimalフィールドの最小値を見つける方法は?

分類Dev

Intellijでロンボク生成コンストラクターの使用法を見つける

分類Dev

IntelliJ IDEAは、兄弟メソッドを見つけることなく、オーバーライドするメソッドの使用法を見つけます

分類Dev

ScalaでのJavaリフレクションのタイプセーフな使用法

分類Dev

インターフェイスでメソッドのインデックスを見つける方法は?

分類Dev

Javaでリフレクションを使用してメソッドが独自の名前を理解できるか

分類Dev

リソースの最も効率的な使用法を見つけるためのアルゴリズム

分類Dev

compareToメソッドの問題を使用して、コレクションから「最大」オブジェクトを見つけるためのJavaのジェネリックメソッド

分類Dev

クラス内でアノテーション付きのメソッドを見つける方法は?

Related 関連記事

  1. 1

    Java:リフレクションコードの使用法を見つける

  2. 2

    スカッシュマイグレーションの使用法(「migration_name」を見つける方法)

  3. 3

    Springコンテキストでメソッドレベルのカスタムアノテーションを見つける

  4. 4

    リフレクションを使用して静的クラスでプライベート静的メソッドを見つける方法は?

  5. 5

    スタックトレースまたはリフレクションを使用してメソッドの呼び出し元を見つけるにはどうすればよいですか?

  6. 6

    リフレクションを使用して、現在実行中のメソッドの名前を見つけることができますか?

  7. 7

    Javaアプリケーションでスレッド作成のソースを見つける

  8. 8

    カスタムApplicationExceptionをキャッチするためのリフレクションを含むJava NegativeTestプライベートメソッド

  9. 9

    ReSharper:オプションのパラメーターの使用法を見つける

  10. 10

    アクションメソッドでクリックされたボタンを見つける方法

  11. 11

    強く型付けされたリフレクションを使用して、ジェネリックパラメーターを持つメソッドを見つけることはできますか?

  12. 12

    バッキングコレクションのメソッド/クラスの概要を見つける場所

  13. 13

    ジェネリックスパラメーターと戻り値型メソッドを持つJavaでリフレクションを使用してクラスのインスタンスを取得する方法

  14. 14

    ストレージAPIでHTTPバッチの使用法を見つける

  15. 15

    IntelliJのクラスインスタンスでscalaapply関数の使用法を見つける方法は?

  16. 16

    Xcodeでカスタムメソッドとプロパティの使用法のヒントを追加するにはどうすればよいですか?

  17. 17

    KubernatesクラスターでServceAccountの使用法を見つける

  18. 18

    AndroidStudioでXMLファイルの使用法を見つけるためのショートカットは何ですか?

  19. 19

    Javaリフレクションを使用してメソッドの型付きリターンを取得する

  20. 20

    カスタム属性を持つlaravelコレクションメソッド

  21. 21

    Javaストリームを使用してコレクション内のBigDecimalフィールドの最小値を見つける方法は?

  22. 22

    Intellijでロンボク生成コンストラクターの使用法を見つける

  23. 23

    IntelliJ IDEAは、兄弟メソッドを見つけることなく、オーバーライドするメソッドの使用法を見つけます

  24. 24

    ScalaでのJavaリフレクションのタイプセーフな使用法

  25. 25

    インターフェイスでメソッドのインデックスを見つける方法は?

  26. 26

    Javaでリフレクションを使用してメソッドが独自の名前を理解できるか

  27. 27

    リソースの最も効率的な使用法を見つけるためのアルゴリズム

  28. 28

    compareToメソッドの問題を使用して、コレクションから「最大」オブジェクトを見つけるためのJavaのジェネリックメソッド

  29. 29

    クラス内でアノテーション付きのメソッドを見つける方法は?

ホットタグ

アーカイブ