Cómo cargar java.util.TimeZone más de una vez en la JVM

Ivan Gladwell:

Creo mi cargador de clases personalizado:

new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());

donde las direcciones URL es una new Url("java.util.TimeZone")

Después de que la clase de carga que por su nombre:

Class<?> newTimeZoneClass = loader.loadClass("java.util.TimeZone");

y newTimeZoneClass==TimeZone.classretornos true.

La razón principal de que mi clase de carga del cargador de clases del cargador de los padres. ¿Como arreglarlo?

G. Simon:

No puedes hacer esto. El modelo de seguridad de Java impide cualquier cargador de clases creación de una clase en el "java. *" Jerarquía. Esto está codificada en el código nativo de la máquina virtual Java, por lo que no hay ninguna solución.

Además, los cargadores de clases estándar siguen el modelo de delegación de pedir el cargador de clases padre a cargar la clase antes de que intenten, por lo que siempre recibe la misma instancia de la clase. cargadores de clases especiales son utilizados por los contenedores de aplicaciones para invertir esta delegación para las clases de aplicaciones específicas.

Hay algunas maneras de hacer esto de todos modos.

En primer lugar, TimeZonees una clase abstracta y la ejecución real es normalmente sun.util.calendar.ZoneInfo. Como esto no está en la jerarquía "java. *", Puede crear varias copias en sus cargadores de clases.

En segundo lugar, se puede sub-clase TimeZone, y todos los métodos delegan a una JVM proporcionado ejemplo, añadiendo su propia funcionalidad que lo hace. He utilizado este para que las instancias de zona horaria únicos en algunas de mis aplicaciones.

En tercer lugar, como el JDK es de código abierto, se puede copiar el código para todo el TimeZoney sus sub-clases en su propia aplicación, y luego se puede tener tantas versiones de la clase que lo desee.

Si desea cambiar los TimeZonecasos devueltos por los métodos estáticos en TimeZone, estos delegado ZoneInfoy que tendrá que utilizar la reflexión ya sea para cambiar el resultado. Si conoces Aspecto-J o equivalente, también se puede interceptar la llamada.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=234970&siteId=1
Recomendado
Clasificación