Я не совсем уверен, что понимаю вопрос, но классы Java уже включают в себя все необходимое для их отражения. Файл .class не изменяется в зависимости от того, как он используется.
Редактировать 1: Предоставить несколько более конкретных примеров, чтобы лучше различать тип "отражения", о котором мы говорим.
Пример:
class Foo {
public void bar() {
System.out.println( "Hello, world." );
}
}
// Conventional calling
Foo f = new Foo();
foo.bar();
// Reflection based callling
Class fooClass = Class.forName( "Foo" );
Method m = fooClass.getMethod( "bar", null );
Object f = fooClass.newInstance();
m.invoke( m, null );
В обычном случае вызова будет загружен Foo.class и любые его прямые зависимости класса. планка будет выполнена. Строки «Foo» и «bar» уже будут интернированы как часть вызывающего класса, потому что байт-код использует строки для разрешения классов и методов во время выполнения. (фактически "bar" будет полной сигнатурой метода, поэтому на самом деле дольше, чем просто "bar")
В случае отражения происходит точно то же самое. Единственный дополнительный загруженный класс - это Method.class. Это должно быть единственное влияние на размер перми.
Последний случай влияет на производительность. Поиск метода является относительно дорогим, поэтому рекомендуется кэшировать объекты метода, когда это возможно. Дополнительный вызов метода для вызова имеет небольшое влияние на производительность, так как это дополнительный вызов метода. Hotspot будет иметь проблемы с оптимизацией через этот вызов ... по крайней мере, больше, чем обычно. JITing происходит точно так же.
Редактировать 2: Отметить некоторые дополнительные объекты, которые загружаются во время отражения ...
java.lang.Class будет создавать и кэшировать объекты метода (или объекты поля и т. Д.) При доступе. Они кэшируются в SoftReference и будут возвращены, если этого потребует использование памяти.
Однако инициализация этих объектов означает, что могут быть дополнительные интернированные строки, загруженные ВМ для поддержки создания этих объектов метода. Я предполагаю, что эти строки, вероятно, уже были частью пула констант отражающего класса, но возможно, что это не так. В любом случае, это одноразовое попадание на метод для каждого класса, для каждого поля для класса и т. Д. Получив доступ к методам, вы получите по крайней мере все имена для этих методов, которые были интернированы. Получив доступ к полям, вы получите имена этих полей, которые были интернированы.