Проверьте пустое тело метода с помощью Java Reflection - PullRequest
4 голосов
/ 03 февраля 2011

Как видно из заголовка, есть ли способ узнать, имеет ли метод пустое тело с использованием отражения?

Ответы [ 4 ]

4 голосов
/ 03 февраля 2011

С отражением, я так не думаю.Вы можете заглянуть в BCEL , хотя ...

Библиотека разработки байт-кода предназначена для предоставления пользователям удобной возможности анализировать , создавать и манипулировать(бинарные) файлы классов Java

Вот фрагмент кода, который может помочь вам начать с этой статьи ...

public class ClassViewer{
   private JavaClass clazz;
   public ClassViewer(String clazz){
      this.clazz = Repository.lookupClass(clazz);
    }
   public static void main(String args[]){
      if(args.length != 1)
        throw new IllegalArgumentException(
          "One and only one class at a time!");
      ClassViewer viewer = new ClassViewer(args[0]);
      viewer.start();
    }
   private void start(){
      if(this.clazz != null){
        // first print the structure 
        // of the class file
        System.err.println(clazz);
        // next print the methods
        Method[] methods = clazz.getMethods();
       for(int i=0; i<methods.length; i++){
          System.err.println(methods[i]);
          // now print the actual
          // byte code for each method
          Code code = methods[i].getCode();
         if(code != null)
            System.err.println(code);
       }
     }else
        throw new RuntimeException(
          "Class file is null!");
    }
}
1 голос
/ 03 февраля 2011

Нет, вы не можете проверить этот фактический (байтовый) код любого данного метода, используя отражение.

0 голосов
/ 04 февраля 2011

Вам, вероятно, понадобится использовать "Java-агенты". Не должно быть никаких разумных оправданий для подобных вещей. Сказав это, типичные реализации самой JVM будут делать такие вещи, чтобы игнорировать финализуемые объекты.

0 голосов
/ 03 февраля 2011

Информация такого рода недоступна через обычный API-интерфейс отражения, который извлекает переменные класса и экземпляра, сигнатуры методов и т. Д., Но не фактический байт-код.

Вы можете использовать библиотеку:

JavaAssist

BCEL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...