He leído la documentación, pero todavía no entiendo qué cargador de clases debería proporcionar como argumento. He intentado algunas opciones, pero esto parece no tener ningún efecto en la compilación o el comportamiento del proxy. Es un poco inquietante que pueda pasar cualquier cosa como el argumento del cargador de clases, incluido el null
, y el código sigue funcionando bien. ¿Alguien puede explicar esto y decirme qué tipo de errores pueden surgir si proporciono un argumento malo para el cargador de clases? Debo añadir que realmente no tengo una idea intuitiva fuerte de lo que es un cargador de clases, en Java o en general.¿Qué ClassLoader debería proporcionar a Proxy.newProxyInstance (...)?
Respuesta
Cualquier clase necesita tener un cargador de clases, por lo tanto, tenemos que dar una aquí.
La parte importante es esto (en the documentation for getProxyClass()
):
Todos los tipos de interfaz debe ser visible por su nombre a través del cargador de clases especificado. En otras palabras, para cl cargador de clases y cada interfaz i, la expresión siguiente tiene que ser verdad:
Class.forName(i.getName(), false, cl) == i
Por lo tanto, se puede utilizar cualquier cargador de clases, donde uno (o más) de sus cargadores de clases de padres definido los dados interfaces.
Si null
funciona en su caso, supongo que sus interfaces tienen también el cargador de clase null
(el cargador de arranque) - entonces no debería importar qué cargador de clases utilizó. Si tiene que crear un proxy de interfaces que no conoce, simplemente tome el cargador de clases de la primera interfaz dada y espere que su interlocutor no haya hecho algo extraño.
¿Por qué es necesario?
Se puede imaginar así:
- El método
getProxyClass()
crea (si no existe todavía) un poco de código de bytes para una nueva clase que implementa todos los métodos de toda la interfaz (cada uno de ellos simplemente reenviar la llamada a suInvocationHandler
). - Luego pasa este bytecode al método
defineClass
del cargador de clases que especificó. - En este bytecode, se hace referencia a todas sus interfaces por nombre, y la máquina virtual ahora usa la llamada citada
forName
para resolver estas interfaces.
Podríamos haber implementado este getProxyClass
esta manera en Java puro, sin ningún tipo de magia VM, pero tendríamos que crear un nuevo cargador de clases (con el especificado como padre) para que en lugar de ser capaz de volver a utilizar una existente uno.
En realidad, puede que no haya un código de bytes real de esta clase sintética, ya que la máquina virtual es capaz de utilizar su magia interna aquí :-)
- 1. ¿Debería ClassLoader ser seguro para subprocesos?
- 2. Debería proporcionar un setter para @Autowired
- 3. ¿Debería proporcionar bibliotecas dependientes en el contenedor de cliente?
- 4. Java ClassLoader cambio
- 5. Cargando archivos con ClassLoader
- 6. debugging osgi classloader issues
- 7. compilador de Java API ClassLoader
- 8. Qué parámetro 'longitud' debería pasar a SqlDataReader.GetBytes()
- 9. modelo de delegación Java ClassLoader?
- 10. Ejemplo de Java con ClassLoader
- 11. Configurar org.apache.log4j.ConsoleAppender con classloader personalizado
- 12. Uso correcto de Classloader (especialmente en Android)
- 13. ¿Cómo obtener classpath de classloader?
- 14. Proporcionar valor a 'System.Windows.Data.Binding' produjo una excepción
- 15. ¿Qué debería servir Apache y qué debería servir Tomcat?
- 16. ¿Qué Python debería usar?
- 17. ¿Qué debería ser hadoop.tmp.dir?
- 18. JavaCompiler con ClassLoader y FileManager personalizados
- 19. dilema de Java classLoader con jaros bloqueados
- 20. MongoDB: ¿Debería proporcionar identificadores que vinculen con otras colecciones o simplemente incluir colecciones?
- 21. Crear nuevo ClassLoader para recargar Clase
- 22. El modelo de seguridad de Java ClassLoader
- 23. ¿Por qué JDK Dynamic Proxy solo funciona con interfaces?
- 24. ¿Cómo poner Custom ClassLoader para usar?
- 25. ¿Qué JSObject debería estar usando?
- 26. Cómo configurar JBOSS 5.1.0 GA ClassLoader
- 27. ¿Por qué debería aprender C++
- 28. C# Logging. ¿Qué debería usar?
- 29. Fuga de ClassLoader - ¿Valen la pena resolverlo?
- 30. ¿Qué paquete postgresql debería usar?
Gracias, yo aún no tengo la intuición de lo que hace un cargador de clases . ¿Puedes mencionar un poco sobre esto? Todavía tengo dificultades para entender por qué un cargador de clases nulo podría funcionar si el cargador de clases fuera responsable de hacer algo sustantivo. ¿Tal vez un ejemplo de juguete en el que se da un cargador de clases incorrecto? – jonderry
El cargador de clases 'null' es el" cargador de clases bootstrap ", el cargador de clases que carga las clases principales (como' Class', 'Object',' ClassLoader'). Se implementa de forma nativa por la máquina virtual y no tiene un objeto ClassLoader. (Es usado por 'Clase.forName' si le das 'null' como el argumento' ClassLoader', por ejemplo). (El ejemplo vendrá más tarde). –