2015-11-29 4 views
0

Допустим, у меня есть класс Foo:Получение постоянного бассейн относится к классу программно

public class Foo { 
    // ... 
} 

Я хочу, чтобы получить его постоянный пул как массив байтов из другого класса. i.e:

public class Bar { 
    void butts() { 
     byte[] fooConstantPool = Foo.class.getConstantPool(); 
     // ... 
    } 
} 

Class#getConstantPool не входит в стандартный API. Есть ли какой-либо последовательный способ, которым я могу получить постоянный пул другого класса?

+0

см. Это сообщение: http://stackoverflow.com/questions/387415/class-getconstantpool –

+0

К сожалению, как упоминалось в ответе на связанную вами нить, к этому методу нельзя получить доступ ни к коду, ни к нему публичный API. Я бы очень хотел придерживаться стандартного Java API, если это вообще возможно. – konsolas

ответ

0

Вы можете получить его в качестве sun.reflect.ConstantPool объекта с помощью отражения, как это:

import sun.reflect.ConstantPool; 
public class Bar { 
    private static final Method getConstantPool; 

    static { 
     try { 
      getConstantPool = Class.class.getDeclaredMethod("getConstantPool"); 
      getConstantPool.setAccessible(true); 
     } catch (NoSuchMethodException e) { 
      throw new RuntimeException(e); 
     } 
    } 
    void butts() { 
     ConstantPool constantPool = (ConstantPool) getConstantPool.invoke(Foo.class); 
     // ... 
    } 
} 

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

+0

К сожалению, интерфейс ConstantPool просто вызывает собственные методы, поэтому его нельзя сериализовать. – konsolas

+0

Да, вы правы. Какова цель получения постоянного пула класса? Может быть, есть еще один способ достичь вашей цели? Например. загрузите файл .class в байтовый массив и используйте загрузчик классов после. – dds

0

Вы можете сканировать свой загрузчик классов, чтобы найти местоположение класса на диске, а затем использовать структуру, такую ​​как BCEL, для ее анализа.

У меня есть сайт, демонстрирующий это, но StackOverflow говорит, что мне не разрешено публиковать ссылки на него.

Смежные вопросы