He creado un frasco sellado, pero no veo diferencia en comparación con el uso de uno no sellado.
- ¿Qué pruebas puedo realizar para verificar que el frasco esté sellado?
- ¿Qué razón podríamos tener para preferir usar un sellado en lugar de uno?
- ¿Un sellado creará algún problema para los usuarios de mis proyectos?
Respuestas:
Puede probar que un jar está sellado definiendo una clase para que exista en un paquete utilizado en el archivo jar. Si el frasco está sellado, todos los paquetes están normalmente sellados, de lo contrario, puede sellarlos por paquete. La clase que cree debería intentar acceder a los miembros protegidos o predeterminados de una clase en ese paquete.
Por ejemplo, si el jar tiene una clase
com.example.Widget
donde el paquetecom.example
está sellado yWidget
tiene miembros protegidos / predeterminados, cree una clasecom.example.Test
que intente acceder a esos miembros. Esto debería fallar.El motivo del sellado se deriva de una descripción de cómo probarlo: desea que su código sea autónomo y los usuarios del jar solo deben usar miembros públicos. No se requiere que los paquetes sean únicos en los archivos jar (y las carpetas bin en su IDE) utilizados por un programa. Puede definir una clase en el mismo paquete que en un jar y acceder a miembros protegidos / predeterminados que pueden causar problemas. A menudo, la visibilidad predeterminada se usa como un análogo a la
friend
palabra clave de C ++ al permitir que otras clases en el mismo paquete puedan realizar acciones que solo son seguras porque los mismos programadores trabajan en ambas clases y entienden sus componentes internos. Tal vez un método de visibilidad predeterminado evita algunos límites al verificar el nombre del rendimiento, con el entendimiento de que el código del cliente nunca accederá a él. Por ejemplo, elString
La clase en Java tiene algunos de estos tipos de métodos ya que el manejo de cadenas debe ser extremadamente rápido porque una gran cantidad de código depende de él.BigDecimal
está construido sobreBigInteger
y utiliza el acceso predeterminado para optimizar algunas operaciones que otros usuarios de la clase no deberían usar.TL; DR : Las clases en el mismo paquete pueden tener acceso a miembros no públicos entre sí por rendimiento o simplicidad. Es posible que este acceso no verifique invariantes y condiciones previas. Uno puede poner clases en el mismo paquete en múltiples ubicaciones en el classpath. Sellar un paquete o jar restringe el acceso del código del cliente a estos métodos, ya que de lo contrario podría romper cosas.
Esto no causará ningún problema a los usuarios del jar. El mecanismo de carga de clases que accede a los recursos (por ejemplo, archivos de clase) en jarras es totalmente compatible con jarras y paquetes sellados.
Lectura relacionada: Sellar paquetes dentro de un archivo JAR
fuente
final
. Si desea que se extienda dentro del jar pero no afuera ... debe comenzar a buscar clases de visibilidad predeterminadas, interfaces, métodos de fábrica, etc., que están fuera del alcance de esta pregunta.Para responder a su segunda pregunta, sellamos nuestros frascos como medida de seguridad, ya que esto evita una forma de inyección de código donde se agregan clases adicionales a nuestra base de código en tiempo de ejecución.
Tenemos una cierta cantidad de reflexión en nuestro código donde los objetos se crean en función de la entrada del usuario. El código que crea estos objetos solo permitirá instanciar clases de nombres de paquetes fijos.
Al sellar los frascos que contienen las clases que queremos que los usuarios puedan crear, no hay forma de que el usuario pueda crear nuevas clases potencialmente peligrosas y hacer que nuestro software las instancia en tiempo de ejecución. A menos que la clase esté en el paquete correcto, nuestro código no lo cargará, y sellar los frascos significa que solo las clases a las que deseamos que los usuarios tengan acceso son accesibles.
Si nuestros Jars no estuvieran sellados, el usuario podría agregar nuevas clases que podrían ser instanciadas. Esto sería un riesgo de seguridad.
TL; DR: al sellar sus jarras, puede evitar un tipo de inyección de código malicioso.
fuente