JDK 7u40 va a realizar cambios en el API de Reflection que podrían romper código
Por motivos de seguridad (aunque no han dado muchos detalles) Oracle tiene intención de realizar cambios en el JDK 7u40 que podrían hacer que programas que ahora se ejecutan correctamente en versiones anteriores dejen de hacerlo; estos cambios afectan al API de Reflection y consisten en la eliminación del método sun.reflect.Reflection.getCallerClass(int).
De un modo temporal, va a existir un comando de consola que va a permitir "reactivar" ese método en un JDK 7:
-Djdk.reflect.allowGetCallerClass
Pero en Java 8 ese método no estará accesible de ningún modo. Y, en cualquier caso, al ser un método no estándar (sun.*) en teoría nadie lo debería estar usando. Pero como siempre sucede con estos métodos, hay gente que los usa. Si vosotros estáis en este caso, tener en cuenta que pronto vais a dejar de poder emplearlo.
Oracle está avisando de esta situación para que no pilla nadie desprevenido cuando publique la u40.
Reader Comments (4)
Por mucho que Oracle avise mi preocupación es enorme. El problema puede estar en frameworks que realizan "magia" (entiéndase un funcionamiento basado en reflection) que obligarán a mantener su uso hasta la correspondiente actualización.
Los cambios en API que rompen compatibilidad son muy drásticos, y sin más información acerca de ese problema de seguridad es difícil dar una opinión, pero tiene que ser muy grave, para que se adopte una decisión de ese calibre.
Por supuesto que el uso de APIs internas de Sun conlleva un riesgo. Lástima que los frameworks no incluyan una referencia de su uso, podría ser un punto más a la hora de valorar una elección.
En docjar
Returns the class of the method realFramesToSkip frames up the stack (zero-based), ignoring frames associated with java.lang.reflect.Method.invoke() and its implementation.
The first frame is that associated with this method, so getCallerClass(0) returns the Class object for sun.reflect.Reflection.
Frames associated with java.lang.reflect.Method.invoke() and its implementation are completely ignored and do not count toward the number of "real" frames skipped.
Por lo que se entiende que esto es de cuidado para todos los que estemos utilizando el método java.lang.reflect.Method.invoke().
Un saludo,
Coming Soon: Preparados una nueva Release de todo Spring para corregir esto.
amigos el metodo .invoke es muy usado con frameworks como ZK que pasaria si el metodo .invoke es eliminado?