No estoy del todo seguro de entender la pregunta, pero las clases de Java ya incluyen todo lo necesario para realizar una reflexión sobre ellas. Un archivo .class no cambia en función de cómo se usa.
Edición 1: Proporcionando algunos ejemplos más específicos para distinguir mejor el tipo de "reflexión" de la que estamos hablando.
Ejemplo:
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);
En el caso de llamada convencional, Foo.class y cualquiera de sus dependencias de clase directa se cargará. la barra se ejecutará. Las cadenas "Foo" y "bar" ya se han internado como parte de la clase de llamada porque el código de bytes utiliza cadenas para resolver las clases y métodos en tiempo de ejecución. (en realidad, "barra" será la firma de método completa, por lo que en realidad es más larga que solo "barra")
En el caso de reflexión, sucede exactamente lo mismo. La única clase adicional cargada es Method.class. Ese debería ser el único efecto en el tamaño de la permanente.
El último caso tiene implicaciones de rendimiento. La búsqueda de métodos es relativamente cara, por lo que es aconsejable guardar en caché los objetos de Method cuando pueda. La invocación de método adicional para invocar tiene una pequeña implicación de rendimiento, ya que se trata de una llamada de método adicional. El punto de acceso tendrá problemas para optimizar a través de esta llamada ... al menos más de lo normal. JITing sucede exactamente lo mismo.
Edición 2: Observando algunos objetos adicionales que se cargan durante la reflexión ...
java.lang.Class creará y método de objetos de caché (u objetos de campo, etc.) en el momento de acceso. Se almacenan en caché en SoftReference y, por lo tanto, se recuperarán si el uso de memoria lo requiere.
Sin embargo, la inicialización de estos objetos significa que puede haber cadenas adicionales internados cargadas por la VM para admitir la creación de estos objetos de Método. Supongo que es probable que estas cadenas ya formen parte del grupo constante de la clase reflexiva, pero es posible que no lo sean. De cualquier manera, es un golpe de tiempo único por método por clase, por campo por clase, etc. Acceda a los métodos, obtendrá al menos todos los nombres de los métodos internados. Acceda a los campos, obtendrá los nombres de esos campos internados.
Lo que creo que está viendo es que se ha introducido el nombre buscado para que '==' se pueda utilizar en los nombres de métodos ya internados. (No estoy convencido de que sea una gran idea.) De cara, la reflexión puede crear clases (a veces). –
(Las cadenas internas son GCable con un ciclo completo de recolección de basura, asume una buena calidad de implementación). –
@Tom, ¿puedes dar un ejemplo único donde se crea una clase por reflexión? No estoy tratando de ser un dolor, realmente me gustaría saber de estos casos ya que nunca he visto uno. – PSpeed