Introducción a la programación Java. ¿Qué es Java? Historia de la creación

Entonces, Java tiene una historia de desarrollo larga y complicada, pero ha llegado el momento de considerar qué lograron los creadores y qué propiedades tiene esta tecnología.

La propiedad más conocida y al mismo tiempo más debatida es la propiedad multi o multiplataforma.

Ya se ha dicho que esto se logra mediante el uso de la máquina virtual JVM, que es un programa normal ejecutado por el sistema operativo y que proporciona a las aplicaciones Java todas las capacidades necesarias. Dado que se especifican todos los parámetros de JVM, la única tarea que queda es implementar máquinas virtuales en todas las plataformas existentes y utilizadas.

La presencia de una máquina virtual determina muchas propiedades de Java, pero ahora centrémonos en la siguiente pregunta: ¿Java es un lenguaje compilado o interpretado? De hecho, se utilizan ambos enfoques.

El código fuente de cualquier programa en lenguaje Java está representado por archivos de texto ordinarios que pueden crearse en cualquier editor de texto o herramienta de desarrollo especializada y tienen la extensión .java. Estos archivos se envían a la entrada del compilador de Java, que los traduce a un código de bytes especial de Java. Es este conjunto de instrucciones compacto y eficiente el que admite la JVM y es una parte integral de la plataforma Java.

El resultado del trabajo del compilador se guarda en archivos binarios con la extensión .class. Una aplicación Java que consta de dichos archivos se suministra como entrada a una máquina virtual, que comienza a ejecutarlos o interpretarlos, ya que es en sí misma un programa.

Sun pronto se dio cuenta de que simplemente publicar especificaciones libremente (lo que ya se hacía mucho antes de Java) no era suficiente. También es necesario crear procedimientos especiales para verificar que los nuevos productos cumplan con las normas. La primera prueba de este tipo para JVM contenía solo alrededor de 600 comprobaciones, un año después su número aumentó a diez mil y ha ido aumentando desde entonces (esto es exactamente lo que MS IE 4.0 no pudo pasar en un momento dado). Por supuesto, los autores de máquinas virtuales las mejoraban constantemente, eliminando errores y optimizando su funcionamiento. Aún así, cualquier tecnología, incluso una muy bien concebida, requiere tiempo para crear una implementación de alta calidad. Java 2 Micro Edition (J2ME) ahora está pasando por un camino de desarrollo similar, pero hablaremos de eso más adelante.

La siguiente propiedad más importante es la orientación a objetos de Java, que siempre se menciona en todos los artículos y comunicados de prensa. El enfoque orientado a objetos (POO) en sí se analiza en la próxima conferencia, pero es importante enfatizar que en Java casi todo se implementa en forma de objetos: subprocesos y flujos de datos, trabajo con la red, trabajo con imágenes, con la interfaz de usuario, el manejo de errores, etc.

Después de todo, cualquier aplicación Java es un conjunto de clases que describen nuevos tipos de objetos.

A lo largo del curso se lleva a cabo una discusión detallada del modelo de objetos Java, pero describiremos las características principales. En primer lugar, los creadores abandonaron la herencia múltiple. Se decidió que hacía que los programas fueran demasiado complicados y confusos. El lenguaje utiliza un enfoque alternativo: una "interfaz" de tipo especial. Se trata en detalle en la conferencia correspondiente.

Sólo hay 8 tipos de datos en Java que no son objetos. Fueron definidos desde la primera versión y nunca han cambiado. Estos son cinco tipos de enteros: byte, short, int, long y también incluyen el carácter char. Luego dos tipos fraccionarios flotantes y dobles y finalmente un tipo booleano booleano. Estos tipos se denominan simples o primitivos (del inglés primitivo) y se analizan en detalle en la conferencia sobre tipos de datos. Todos los demás tipos son objeto o referencia. referencia).

Por alguna razón, la sintaxis de Java ha confundido a mucha gente. De hecho, se crea sobre la base de la sintaxis de los lenguajes C/C++, por lo que si observa el código fuente de los programas escritos en estos lenguajes y en Java, no es posible comprender de inmediato en cuál de ellos está escrito. qué idioma. Por alguna razón, esto le ha dado a mucha gente una razón para pensar que Java es un C++ simplificado con características adicionales como un recolector de basura.

Veremos el recolector de basura automático a continuación, pero es un gran error pensar que Java es el mismo lenguaje que C++.

Por supuesto, al desarrollar una nueva tecnología, los autores de Java se basaron en un lenguaje de programación ampliamente utilizado por diversas razones.

En primer lugar, en aquel momento ellos mismos consideraban que C++ era su principal herramienta. En segundo lugar, ¿por qué inventar algo nuevo cuando existe uno antiguo que se adapta perfectamente? Finalmente, es obvio que una sintaxis desconocida asustará a los desarrolladores y complicará significativamente la implementación de un nuevo lenguaje, pero Java debería haberse generalizado lo más rápido posible. Por lo tanto, la sintaxis se ha simplificado sólo ligeramente para evitar construcciones demasiado confusas.

Otra propiedad importante de Java, la facilidad de aprendizaje y desarrollo, también recibió críticas mixtas. De hecho, los autores se han tomado la molestia de librar a los programadores de los errores más comunes que a veces cometen incluso los desarrolladores experimentados de C/C++. Y el primer lugar aquí lo ocupa el trabajo con la memoria.

Java se introdujo desde el principio. mecanismo automático de recolección de basura(del recolector de basura inglés). Supongamos que un programa crea un objeto, trabaja con él y luego llega un momento en el que ya no es necesario. Es necesario liberar la memoria ocupada para no interferir con el normal funcionamiento del sistema operativo. En C/C++ esto debe hacerse explícitamente desde el programa. Obviamente, con este enfoque existen dos peligros: eliminar un objeto que todavía necesita alguien (y si realmente se accede a él, se producirá un error) o no eliminar un objeto que se ha vuelto innecesario, y esto significa una pérdida de memoria. , es decir, el programa comienza a consumir una cantidad cada vez mayor de RAM.

Al desarrollar en Java, el programador no piensa en absoluto en liberar memoria. La propia máquina virtual cuenta el número de referencias a cada objeto y, si llega a ser cero, dicho objeto se marca para que el recolector de basura lo procese. Por tanto, el programador sólo debe asegurarse de que no haya referencias a objetos innecesarios. El recolector de basura es un subproceso en segundo plano que examina periódicamente los objetos existentes y elimina aquellos que ya no son necesarios. El programa no puede influir en el funcionamiento del recolector de basura de ninguna manera; sólo puede iniciar explícitamente su siguiente paso utilizando una función estándar. Está claro que esto simplifica enormemente el desarrollo de programas, especialmente para los programadores novatos.

Sin embargo, los desarrolladores experimentados no estaban contentos porque no podían controlar completamente todo lo que sucedía en su sistema. No hay información exacta sobre cuándo se eliminará exactamente un objeto que se ha vuelto innecesario, cuándo comenzará a funcionar el hilo del recolector de basura (y, por lo tanto, a ocupar recursos del sistema), etc. Pero, con el debido respeto a la experiencia de estos programadores, cabe señalar que la inmensa mayoría de los fallos de los programas escritos en C/C++ se deben a un funcionamiento incorrecto de la memoria y, a veces, esto sucede incluso con productos ampliamente utilizados de empresas muy serias. empresas.

Además, se hizo especial hincapié en la facilidad para dominar la nueva tecnología. Como ya se mencionó, se esperaba (¡y estas expectativas estaban justificadas, confirmando la exactitud del camino elegido!) que Java debería usarse lo más ampliamente posible, incluso en aquellas empresas que nunca antes se habían dedicado a la programación a este nivel (electrodomésticos como tostadoras y cafeteras, creación de juegos y otras aplicaciones para móviles, etc.). También hubo una serie de otras consideraciones. Los productos para usuarios cotidianos, no para programadores profesionales, deben ser especialmente confiables.

Internet se convirtió en la World Wide Web porque aparecieron usuarios no profesionales y la posibilidad de crear subprogramas para ellos no resultó menos atractiva. Necesitaban una herramienta sencilla para crear aplicaciones sólidas.

Finalmente, el boom de Internet de los años 90 cobró impulso y planteó requisitos nuevos y más estrictos en cuanto al tiempo de desarrollo. Los proyectos de varios años, que eran habituales en el pasado, ya no satisfacían las necesidades de los clientes; los nuevos sistemas debían crearse en un máximo de un año, o incluso en cuestión de meses.

Además de introducir el recolector de basura, se han tomado otras medidas para facilitar el desarrollo. Algunos de ellos ya se han mencionado: la eliminación de la herencia múltiple, la simplificación de la sintaxis, etc. La capacidad de crear aplicaciones multiproceso se implementó en la primera versión de Java (las investigaciones han demostrado que esto es muy conveniente para los usuarios y los estándares existentes se basan en sistemas de teletipo que están obsoletos desde hace muchos años). Otras características se discutirán en conferencias posteriores. Sin embargo, durante mucho tiempo ha sido un hecho generalmente aceptado que crear y mantener sistemas es más fácil en Java que en C/C++. Sin embargo, estos lenguajes se crean para diferentes propósitos y cada uno tiene sus propias ventajas innegables.

Primero, estas son las reglas para trabajar con la memoria. Ya se ha dicho que la limpieza de la memoria se realiza de forma automática. Su reserva también la determina la JVM, no el compilador, o explícitamente desde el programa el desarrollador solo puede indicar que quiere crear otro objeto nuevo; Básicamente no hay señales de direcciones físicas.

En segundo lugar, la presencia de un intérprete de máquina virtual hace que sea mucho más fácil eliminar códigos peligrosos en cada etapa del trabajo. Primero, el código de bytes se carga en el sistema, generalmente en forma de archivos de clase. La JVM comprueba cuidadosamente que todos sigan las reglas generales de seguridad de Java y que no hayan sido creados por atacantes a través de otros medios (o dañados en tránsito). Luego, durante la ejecución del programa, el intérprete puede comprobar fácilmente la validez de cada acción. Las capacidades de las clases que se cargaron desde un disco local o a través de la red difieren significativamente (el usuario puede asignar o revocar derechos específicos fácilmente).

Por ejemplo, los subprogramas de forma predeterminada nunca accederán al sistema de archivos local. Todas las bibliotecas estándar de Java tienen restricciones integradas.

Finalmente, existe un mecanismo para firmar subprogramas y otras aplicaciones descargadas a través de la red. Un certificado especial garantiza que el usuario recibió el código exactamente en la forma en que lo emitió el fabricante. Esto, por supuesto, no proporciona protección adicional, pero permite al cliente negarse a trabajar con aplicaciones de fabricantes que no son de confianza o ver inmediatamente que se han realizado cambios no autorizados en el programa. En el peor de los casos, sabe quién es el responsable del daño causado.

La combinación de las propiedades descritas de Java nos permite afirmar que el lenguaje es muy adecuado para desarrollar aplicaciones de Internet e intranet (redes corporativas internas).

Finalmente, una característica distintiva importante de Java es su dinamismo. El lenguaje está muy bien concebido; en su desarrollo participan cientos de miles de desarrolladores y muchas grandes empresas.

  • Las principales etapas de este desarrollo se tratan brevemente en la siguiente sección. multiplataforma ;
  • Entonces, resumamos. La plataforma Java tiene las siguientes ventajas:
  • portabilidad, o
  • orientación a objetos, se ha creado un modelo de objetos eficaz;
  • sintaxis familiar de C/C++;
  • modelo de seguridad integrado y transparente;
  • centrarse en tareas de Internet, aplicaciones de red distribuidas;

Pero no se debe suponer que un aprendizaje más fácil significa que no es necesario aprender el idioma en absoluto. Para escribir programas realmente buenos y crear sistemas grandes y complejos, se necesita una comprensión clara de todos los conceptos básicos de Java y las bibliotecas utilizadas.

Esto es exactamente a lo que está dedicado este curso.

Principales versiones y productos de Java

Dejemos claro de inmediato que aquí por productos nos referimos a soluciones de software de Sun, que son "implementaciones de referencia".

  • Java se anunció por primera vez el 23 de mayo de 1995. Los principales productos disponibles en ese momento en versiones beta eran: Especificación del lenguaje Java
  • , JLS , la especificación del lenguaje Java (que describe vocabulario, tipos de datos, construcciones básicas, etc.);
  • especificación JVM;

Java Development Kit, JDK: una herramienta de desarrollo que consta principalmente de utilidades, bibliotecas de clases estándar y demostraciones.

La especificación del lenguaje se compiló con tanto éxito que hasta el día de hoy se utiliza prácticamente sin cambios. Por supuesto, se hicieron muchas aclaraciones, se agregaron descripciones más detalladas y se agregaron algunas características nuevas (por ejemplo, declarar clases internas), pero los conceptos básicos permanecen sin cambios.

Este curso se basa en gran medida en la especificación del lenguaje.

La especificación JVM está destinada principalmente a creadores de máquinas virtuales y, por lo tanto, prácticamente no la utilizan los programadores de Java.

  • El JDK ha sido durante mucho tiempo la herramienta de referencia para el desarrollo de aplicaciones.
  • No contiene ningún editor de texto, pero funciona sólo con archivos Java existentes.
  • El compilador está representado por la utilidad javac (compilador de Java).
  • La máquina virtual está implementada por el programa java. Para ejecutar pruebas de subprogramas, existe una utilidad especial Appletviewer.
  • Finalmente, se incluye una herramienta javadoc para generar automáticamente documentación a partir del código fuente.
  • La primera versión contenía sólo 8 bibliotecas estándar:
  • java.net: trabajar con la red.

Así, todas las bibliotecas comienzan con java, son las estándar. Todos los demás (comenzando con com, org, etc.) pueden cambiar en cualquier versión sin soporte de compatibilidad.

La versión final de JDK 1.0 se lanzó en enero de 1996.

Expliquemos inmediatamente el sistema de nombres de versiones. La designación de la versión consta de tres números. El primero es siempre 1. Esto significa que se mantiene total compatibilidad entre todas las versiones de 1.x.x. Es decir, un programa escrito en un JDK antiguo siempre se ejecutará correctamente en uno más nuevo. Si es posible, también se observa compatibilidad con versiones anteriores: si el programa se compila con un JDK más nuevo y no se utilizaron bibliotecas nuevas, en la mayoría de los casos, las máquinas virtuales más antiguas podrán ejecutar dicho código.

El segundo dígito cambió de 0 a 4 (el último en el momento de creación del curso). En cada versión, hubo una expansión significativa de las bibliotecas estándar (212, 504, 1781, 2130 y 2738 - el número de clases e interfaces de 1.0 a 1.4), y también se agregaron algunas características nuevas al lenguaje en sí. Las utilidades incluidas en el JDK también han cambiado.

Finalmente, el tercer número significa el desarrollo de una versión. Nada cambia en el idioma o las bibliotecas, solo se eliminan los errores, se realiza la optimización y se pueden cambiar (agregar) argumentos de utilidad. Entonces, la última versión de JDK 1.0 es 1.0.2.

Aunque no se elimina nada con el desarrollo de la versión 1.x, por supuesto, algunas funciones o clases quedan obsoletas. Se declaran obsoletos y, aunque serán compatibles hasta el anuncio de la versión 2.0 (y aún no se ha oído nada al respecto), no se recomiendan.

Junto con el éxito inicial de JDK 1.0 llegaron las críticas. Las principales deficiencias descubiertas por los desarrolladores fueron las siguientes. Primero, por supuesto, está el rendimiento. La primera máquina virtual era muy lenta. Esto se debe al hecho de que la JVM es esencialmente un intérprete que siempre se ejecuta más lento que el código compilado. Sin embargo, aún estaba por llegar una optimización exitosa que eliminara esta deficiencia. También se observaron las capacidades bastante pobres de AWT, la falta de trabajo con bases de datos y otros.

En diciembre de 1996, se anunció una nueva versión de JDK 1.1 e inmediatamente se lanzó una versión beta de acceso gratuito. La versión final se publicó en febrero de 1997. ¿Qué se ha agregado en la nueva versión de Java?

Por supuesto, se prestó especial atención al rendimiento. Muchas partes de la máquina virtual se han optimizado y reescrito usando Assembler en lugar de C como antes. Además, desde octubre de 1996, Sun ha estado desarrollando un nuevo producto: el compilador Just-In-Time, JIT. Su tarea es traducir el código de bytes Java del programa al código "nativo" del sistema operativo. Por lo tanto, el tiempo de inicio del programa aumenta, pero la ejecución se puede acelerar en algunos casos hasta 50 veces. Desde julio de 1997 apareció una implementación para Windows y JIT se incluye de serie en el JDK con la posibilidad de desactivarlo.

Se han agregado muchas características nuevas e importantes. JavaBeans, una tecnología anunciada en 1996, permite crear componentes visuales que se integran fácilmente en herramientas de desarrollo visual. JDBC (Java DataBase Connectivity) proporciona acceso a bases de datos. RMI (Invocación de método remoto) facilita la creación de aplicaciones distribuidas.

Se ha mejorado el soporte para idiomas nacionales y el sistema de seguridad.

En las primeras tres semanas, JDK 1.1 se descargó más de 220.000 veces, menos de un año después, más de dos millones de veces. Por el momento, la versión 1.1 se considera completamente obsoleta y su desarrollo se detuvo en la 1.1.8. Sin embargo, debido a que el navegador más común, MS IE, todavía sólo admite esta versión, se sigue utilizando para escribir pequeños subprogramas.

Además, el 11 de marzo de 1997, Sun comenzó a ofrecer Java Runtime Environment, JRE (Java Runtime Environment).

  • Básicamente, esta es la implementación mínima de máquina virtual necesaria para ejecutar aplicaciones Java, sin un compilador u otras herramientas de desarrollo. Si el usuario sólo quiere ejecutar programas, esto es exactamente lo que necesita.

El lenguaje de programación Java y el sistema de soporte de ejecución que lo acompaña fueron diseñados para garantizar que los programas, una vez desarrollados y compilados, se entregaran a través de Internet en forma binaria y se ejecutaran en cualquier máquina compatible con Java. La seguridad ha sido parte del desarrollo de Java desde el principio. Esta sección discutirá el funcionamiento de este sistema de seguridad.

Java es un lenguaje de tipo seguro. Esto significa que el compilador rechazará cualquier intento de utilizar la variable de esta manera.



Hagamos coincidir su tipo. Para comparar, considere lo siguiente

Genera un número aleatorio y lo almacena en el puntero p. Luego almacena el byte nulo en la dirección contenida en p, sobrescribiendo todo lo que había antes: código o datos. En Java, las construcciones que mezclan tipos de esta manera están prohibidas por la propia gramática. Además, Java no tiene variables de puntero, conversión de tipos, asignación de memoria controlada por el usuario (como malloc y free), y todas las referencias a matrices se verifican en tiempo de ejecución.

Los programas Java se compilan en un código binario intermedio llamado código de bytes JVM. La JVM tiene alrededor de 100 comandos, la mayoría de los cuales empujan objetos de cierto tipo a la pila, los sacan de la pila o combinan aritméticamente dos entradas en la pila. Estos programas JVM generalmente se interpretan, aunque hasta cierto punto
En algunos casos, se pueden compilar en lenguaje de máquina para una ejecución más rápida. En el modelo Java, los subprogramas enviados a través de Internet para su ejecución remota son programas JVM.

Cuando llega un subprograma, se somete a un proceso que verifica el código de bytes de JVM para ver si cumple con ciertas reglas. Un subprograma compilado correctamente los coincidirá automáticamente, pero no hay nada que impida a los atacantes escribir un subprograma JVM en lenguaje ensamblador JVM. El procedimiento de verificación incluye la búsqueda de respuestas a las siguientes preguntas:

1. ¿Está el subprograma intentando falsificar punteros?

2. ¿Viola las restricciones de acceso a miembros de clases privadas?

3. ¿Está intentando utilizar una variable de un tipo como variable de otro tipo?

4. ¿Genera un desbordamiento o un desbordamiento insuficiente de la pila?

5. ¿Realiza conversiones ilegales de variables de un tipo a variables de otro tipo?

Si el subprograma pasa todas estas pruebas, se puede ejecutar sin preocuparse de que acceda a áreas de memoria que no están destinadas a ser utilizadas.

Sin embargo, los subprogramas aún pueden realizar llamadas al sistema llamando a métodos (procedimientos) Java proporcionados para estos fines. Los métodos utilizados para hacer esto en Java han mejorado todo el tiempo. En la primera versión de Java, JDK (Java Development Kit) 1.0, los subprogramas se dividían en dos clases: confiables y no confiables. Los applets recuperados del disco local eran confiables y se les permitía realizar cualquier llamada al sistema que necesitaran. Por el contrario, los subprogramas recibidos a través de Internet se consideraban poco fiables. Se ejecutaron en un sandbox, como se muestra en la Fig. 9.33, y prácticamente no les permitieron hacer nada.

Después de adquirir experiencia con este modelo, Sun decidió que era demasiado restrictivo. JDK 1.1 introdujo la firma de código digital. Cuando llegaba un subprograma de Internet, se verificaba si estaba firmado por una persona u organización en la que el usuario confiaba (según lo determinado por la lista del usuario de titulares de firmas digitales confiables). Si se podía confiar en la firma, el subprograma podía hacer lo que quisiera; si no, se ejecutaba en un entorno limitado con restricciones estrictas.

Después de adquirir más experiencia, este sistema también resultó insatisfactorio, por lo que se volvió a cambiar el modelo de seguridad. JDK 1.2 introdujo una política de seguridad detallada y configurable que se aplica a todos los subprogramas, tanto locales como remotos. Este modelo de seguridad es tan complejo que merece un libro aparte (Gong, 1999), por lo que sólo haremos un breve resumen de algunas de sus principales características. Cada subprograma se caracteriza por dos cosas: de dónde viene y quién lo firmó. La pregunta de dónde viene se responde con su URL, y la pregunta de quién lo firmó se responde con la clave privada que se utilizó para firmarlo digitalmente. Cada usuario puede crear una política de seguridad que consta de una lista de reglas. Cada regla puede enumerar la URL, el propietario de la firma, el objeto y qué acción puede realizar el subprograma sobre el objeto si la URL del subprograma

y el propietario de la firma coincidirán con los especificados en la regla. Conceptualmente, la información proporcionada se muestra en la Tabla. 9.3, aunque en realidad tiene un formato diferente y se relaciona con la jerarquía de clases de Java.


Un tipo de acción permite el acceso al archivo. Una acción puede especificar un archivo o directorio específico, un conjunto de todos los archivos en un directorio determinado o un conjunto de todos los archivos y directorios contenidos de forma recursiva en un directorio determinado. Tres líneas en la tabla. 9.3 corresponden a estos tres casos. En la primera línea, la usuaria Susan ha configurado su registro de permisos para que los applets provenientes de su máquina procesadora de datos tributarios, llamada www.taxprep.com, y firmados por la empresa procesadora, tengan acceso de lectura a sus datos tributarios en el formato 1040.xls. archivo. . Sólo pueden leer este archivo, que ningún otro subprograma puede leer. Además, todos los subprogramas de todas las fuentes, firmados o no, pueden leer y escribir archivos en el directorio /usr/tmp.

Además, Susan confía lo suficiente en Microsoft como para permitir que los subprogramas obtenidos de su sitio y firmados por la empresa lean, escriban y eliminen archivos debajo del directorio de Office en el árbol de directorios, por ejemplo, para solucionar problemas e instalar nuevas versiones de software. Para verificar las firmas, Susan debe tener la clave pública requerida en su disco o debe obtenerlas dinámicamente, por ejemplo, en forma de un certificado firmado por una empresa en la que confía y cuya clave pública tiene.

No sólo los archivos pueden actuar como recursos protegidos. También puede proteger el acceso a la red. Aquí el objeto será un puerto específico en una computadora específica. La computadora se especifica usando su dirección IP o nombre DNS; Los puertos de esta computadora se indican mediante una variedad de números. Las posibles acciones incluyen conectarse a la computadora remota y aceptar conexiones provenientes de la computadora remota. Por lo tanto, el subprograma puede acceder a la red, pero este acceso se limita a comunicarse sólo con aquellas computadoras que están explícitamente enumeradas en la lista de permisos. Los applets pueden cargar dinámicamente código adicional (clases) según sea necesario, pero los cargadores de clases proporcionados por el usuario pueden ejercer un control estricto sobre qué máquinas pueden obtener esas clases. También hay muchas otras características de seguridad.

Más sobre el tema Seguridad en el sistema Java:

  1. § 39 Clasificación de los contratos en determinados tipos. – Clasificación romana. – Sistema de derecho prusiano, código francés y austriaco. – Sistema de arco ruso. – El sistema de la presente presentación.

La sección Java de desarrolladorWorks contiene cientos de artículos, tutoriales, sugerencias y recursos escritos por miembros de la comunidad Java para ayudarle a aprovechar al máximo la plataforma Java y las tecnologías relacionadas a medida que desarrolla aplicaciones. Sin embargo, para los nuevos desarrolladores que recién comienzan a aprender Java, puede resultar difícil navegar por la gran cantidad de recursos disponibles en Internet. Es por eso que hemos creado esta página para brindar una descripción general de las tecnologías centrales de Java en el contexto general de las capacidades del lenguaje. Aquí encontrará enlaces para obtener más información sobre Java, como artículos de DeveloperWorks para principiantes y otros recursos educativos, así como enlaces para descargar productos de IBM.

¿Eres un desarrollador Java principiante? En esta página encontrará una descripción general de las principales tecnologías Java™ y su lugar en el desarrollo de software moderno. Con enlaces a artículos introductorios de DeveloperWorks sobre este y temas relacionados, otros materiales educativos, descargas y productos de IBM, esta página es un excelente punto de partida para aprender Java.

¿Qué son las "tecnologías Java"?

Java es a la vez un lenguaje de programación y una plataforma.

Primero, Java es un software orientado a objetos de alto nivel. lenguaje de programación. En compilación, que se ejecuta una vez durante la compilación de la aplicación, el código Java se convierte en código de lenguaje intermedio ( código de bytes). A su vez, el código de bytes se analiza y ejecuta ( interpretado) una máquina virtual Java (JVM), que actúa como traductor entre el lenguaje Java y el hardware del sistema operativo. Todas las implementaciones de Java deben emular la JVM para que las aplicaciones que cree puedan ejecutarse en cualquier sistema que incluya una máquina virtual Java.

En segundo lugar, Java es plataforma de software, cuyas versiones están disponibles para varios sistemas de hardware. Hay tres versiones de Java (consulte las ediciones de la plataforma Java a continuación). paquetes, que contienen clases e interfaces para resolver problemas relacionados.

Además de la API, toda implementación completa de la plataforma Java debe incluir lo siguiente:

  • Herramientas de desarrollo para compilar, ejecutar, monitorear, depurar y documentar aplicaciones.
  • Mecanismos estándar para implementar aplicaciones en el entorno del usuario.
  • Kits de herramientas que le permiten crear interfaces gráficas de usuario complejas.
  • Bibliotecas de integración para acceso programático a bases de datos y manipulación remota de objetos.

La JVM también es un entorno probado para ejecutar aplicaciones escritas en lenguajes distintos de Java. En particular, Groovy, Scala y las implementaciones especializadas de Ruby y Python brindan a los desarrolladores la capacidad de ejecutar lenguajes dinámicos y funcionales en la JVM (para obtener más información, consulte ¿Qué tiene que ver Java con los lenguajes dinámicos y la programación funcional? ?).

El lenguaje Java fue desarrollado por Sun Microsystems. Actualmente, el desarrollo de tecnologías Java, incluido el trabajo sobre especificaciones, implementaciones de referencia y pruebas de compatibilidad, se lleva a cabo bajo el control de la organización abierta sin fines de lucro JCP (Java Community Process), que reúne a desarrolladores y titulares de licencias de Java. En 2007, Sun lanzó una versión gratuita de Java, incluidos los componentes principales de la plataforma, bajo la licencia GNU GPL v2 (GPLv2). Puedes leer más sobre esta versión en la sección Java y Desarrollo de Software Libre.

¿Por qué deberías aprender Java?

La principal ventaja del lenguaje Java es la portabilidad de las aplicaciones Java, es decir. capacidad de ejecutarse en cualquier plataforma de hardware y sistema operativo, ya que todas las JVM, independientemente de la plataforma en la que se ejecuten, son capaces de ejecutar el mismo código de bytes.

El lenguaje y la plataforma Java son altamente escalables. Puede crear fácilmente aplicaciones para dispositivos con recursos limitados adaptando el software escrito originalmente para computadoras de escritorio. Al mismo tiempo, el lenguaje Java es ideal para desarrollar aplicaciones web del lado del servidor, a través de las cuales el usuario puede acceder a recursos informáticos en la Web. La capacidad de ejecutar de forma segura código descargado a través de Internet se incorporó al diseño de Java, por lo que el lenguaje proporciona un alto nivel de seguridad cuando se trabaja a través de Internet. Las aplicaciones web se ejecutan en entornos de ejecución llamados Contenedores web, que brindan una variedad de servicios convenientes, que incluyen envío de solicitudes, seguridad y concurrencia, administración del ciclo de vida y acceso a API como administración de nombres, administración de transacciones y correo electrónico. Varias cosas están escritas en Java. servidores de aplicaciones, que actúan como contenedores web para otros componentes Java, XML y servicios web que interactúan con bases de datos y generan dinámicamente el contenido de las páginas web. Dichos servidores también proporcionan un entorno para implementar aplicaciones y herramientas empresariales para la gestión de transacciones, agrupación en clústeres, seguridad, conectividad y los niveles necesarios de disponibilidad, rendimiento y escalabilidad.

Al admitir el uso de estándares abiertos en aplicaciones empresariales, Java abre la posibilidad de utilizar servicios web basados ​​en XML para ayudar a los socios comerciales a compartir recursos de información y aplicaciones. Java sustenta muchos de los productos y servicios de consultoría técnica de IBM (Productos y tecnologías IBM para desarrolladores de Java) y desempeña un papel clave en varios de los negocios más importantes de la empresa.

  • Explore el enfoque de IBM y aprenda cómo SOA le ayuda a crear aplicaciones heterogéneas que obtienen funcionalidad de múltiples fuentes tanto dentro como fuera de la empresa, soportando así procesos de negocio horizontales.
  • El enfoque de componentes de IBM proporciona una gama completa de capacidades para impulsar el cambio estratégico. Las soluciones proporcionadas se basan en una infraestructura de hardware y software flexible, extensible y abierto basado en estándares (incluido Java).

Ediciones de la plataforma Java
La plataforma Java está disponible en tres ediciones, lo que permite a los desarrolladores de aplicaciones, proveedores de servicios y fabricantes de hardware crear soluciones que satisfagan las necesidades de grupos de usuarios específicos.

  • Java SE (plataforma Java, edición estándar).
    • Con Java SE, puede crear e implementar aplicaciones Java para escritorios y servidores, y desarrollar software y programas integrados para sistemas en tiempo real. La edición Java SE incluye las clases necesarias para crear servicios web y los componentes principales de Java EE (Java Platform, Enterprise Edition). La versión actual de la plataforma Java SE es Java SE 6, también conocida como "Mustang". Sin embargo, muchos desarrolladores todavía utilizan Java SE 5 (Java 5.0 o "Tiger").
    • Para obtener una excelente descripción general de las características de Java SE 5, consulte los artículos de la columna. Gran parte de los aspectos de programación de la plataforma Java SE 5, para la que se crearon muchas aplicaciones existentes, siguen siendo relevantes en Java SE 6.
    • Este artículo describe las nuevas funciones de Java SE 6 que le ayudarán a supervisar y evaluar el rendimiento de las aplicaciones.
    • Este artículo proporciona una introducción a un lenguaje de secuencias de comandos que se ejecuta sobre la plataforma Java SE 6 para simplificar la programación de interfaces de usuario complejas.
  • Esta serie de dos partes proporciona una introducción a la API proporcionada por Java SE 6, que permite que las aplicaciones Java ejecuten código de script dinámico y viceversa. . Java EE (plataforma Java, edición empresarial)
    • . Esta versión empresarial de la plataforma ayuda a los desarrolladores a crear e implementar aplicaciones de servidor Java portátiles, confiables, escalables y seguras. Aprovechando las capacidades de Java SE, Java EE proporciona servicios web, modelos de componentes, API de gestión y comunicación remota para permitir implementaciones de software empresarial SOA y Web 2.0.
    • Lea los artículos y obtenga una descripción general introductoria de la última versión de la plataforma Java EE.
    • Para obtener más información sobre Java EE, consulte los artículos de la columna.
    • Los artículos de la serie Introducción: Migración a la plataforma Java se escribieron específicamente para desarrolladores de aplicaciones .NET, cliente-servidor de Windows y ASP para ayudarles a migrar a Java.
  • Java ME (plataforma Java, edición Micro). Java ME proporciona un entorno para ejecutar aplicaciones creadas para una amplia gama de sistemas móviles e integrados, como teléfonos móviles, PDA, decodificadores e impresoras. Esta edición de la plataforma proporciona herramientas para crear interfaces de usuario flexibles, un modelo de seguridad sólido, una gama completa de protocolos de red integrados y un potente soporte para aplicaciones cargadas dinámicamente en línea y fuera de línea. Las aplicaciones basadas en las especificaciones Java ME pueden ejecutarse en una variedad de dispositivos y aún así poder utilizar de manera efectiva las capacidades del sistema.

¿Qué tecnologías son los componentes principales de la plataforma Java?

La sección Java de desarrolladorWorks contiene los componentes de Java. A continuación se muestran algunos de los componentes, posibles paquetes adicionales y extensiones incluidas en cada edición de la plataforma. Cada tecnología recibe una breve descripción, así como un enlace a materiales que describen su lugar en el mundo Java. Tenga en cuenta que muchos de los componentes están incluidos en las tres ediciones de la plataforma Java.

Tecnologías incluidas en Java SE:

  • Clases básicas de Java (Swing)(JFC) es un conjunto de bibliotecas de clases Java que se utilizan para crear interfaces gráficas de usuario e implementar otras funciones gráficas en aplicaciones cliente Java. Gestión .
  • JavaAyuda es un sistema de ayuda extensible e independiente de la plataforma que permite a los desarrolladores y redactores técnicos incorporar páginas de ayuda en subprogramas, componentes de software, aplicaciones, sistemas operativos y dispositivos, y crear sistemas de ayuda web. Consulte el artículo.
  • Gracias a Interfaz nativa de Java(JNI) Las aplicaciones Java que se ejecutan dentro de la JVM pueden interactuar con programas y bibliotecas escritas en otros lenguajes de programación.
  • Tecnología Inicio web de Java Simplifica la implementación de aplicaciones Java al permitir a los usuarios descargar y ejecutar software completo, como hojas de cálculo, con solo hacer clic con el mouse, sin instalación (ver artículo).
  • Conectividad de base de datos Java(JDBC) es una API que proporciona un medio para acceder a la mayoría de fuentes de datos relacionales desde aplicaciones Java. Puede conectarse a una variedad de bases de datos SQL, así como a otras fuentes de datos tabulares, como hojas de cálculo y archivos planos.
  • Imágenes avanzadas de Java(JAI) es una API orientada a objetos que proporciona un modelo de programación simple y de alto nivel que facilita la manipulación de imágenes.
  • Servicio de autenticación y autorización de Java(JAAS) es una tecnología que proporciona servicios con un medio para autenticar a los usuarios y comprobar sus derechos de acceso. Incluye una implementación Java del marco estándar PAM (Módulo de autenticación conectable) y admite autorización a nivel de usuario.
  • Extensión de criptografía Java(JCE) es un conjunto de paquetes que proporcionan infraestructura e implementaciones para cifrado, generación e intercambio de claves y algoritmos de código de autenticación de mensajes (MAC). Esta tecnología también incluye soporte para cifrados simétricos, asimétricos, de bloques y de flujo, así como flujos seguros y objetos sellados. Puede encontrar información más detallada en el manual.
  • Objetos de datos Java(JDO) es un modelo estándar, abstracto y basado en interfaz para el almacenamiento a largo plazo de objetos Java. Permite a los desarrolladores almacenar directamente instancias de clases de dominio Java en un almacenamiento persistente (como una base de datos). En algunos casos, este modelo puede reemplazar la escritura directa en un archivo, la serialización, JDBC, así como el uso de componentes del servidor EJB, tanto administrados por contenedor (Container Managed Persistence - CMP) como en estado de almacenamiento automático (Bean Managed Persistence - BMP). .
  • bolsa de plastico Extensiones de gestión de Java(JMX) proporciona herramientas para crear aplicaciones distribuidas, modulares, dinámicas y accesibles desde la web para administrar y monitorear dispositivos, software y redes basadas en servicios (ver artículo).
  • Marco de medios Java(JMF) le permite agregar audio, video y otra información multimedia a aplicaciones y subprogramas Java (consulte el manual).
  • Interfaz de directorio y nombres de Java(JNDI) es una interfaz unificada para acceder a varios servicios de directorio y nombres en una red empresarial. Permite que las aplicaciones se conecten de manera eficiente a múltiples servicios de directorio y nombres en un entorno empresarial heterogéneo.
  • Extensiones de socket seguro de Java(JSSE) es un conjunto de paquetes para permitir el intercambio seguro de información en Internet.
  • Implementan la versión Java de los protocolos SSL (Secure Sockets Layer) y TLS (Transport Layer Security) y proporcionan herramientas para el cifrado de datos, verificación de la integridad de los mensajes y autenticación del servidor y del cliente (esta última característica es opcional). API de voz de Java
  • (JSAPI) incluye las especificaciones JSGF (Java Speech Grammar Format) y JSML (Java Speech Markup Language). Este paquete proporciona capacidades para utilizar tecnologías de voz en la interfaz de usuario. JSAPI es una API multiplataforma que admite reconocimiento de voz, sistemas de entrada de voz y síntesis de voz. Para obtener más detalles, consulte la siguiente sección del artículo.
  • Java 3D es una API que proporciona capacidades escalables y multiplataforma para trabajar con gráficos 3D en aplicaciones Java. La API está organizada como un conjunto de interfaces orientadas a objetos que forman un modelo de programación único, simple y de alto nivel. Mecanismo
  • Instalación de metadatos permite a los desarrolladores definir atributos para clases, interfaces, campos y métodos para que puedan estar sujetos a un procesamiento especial por parte de herramientas de desarrollo, herramientas de implementación y bibliotecas de terceros en tiempo de ejecución (ver artículo).
  • API del repositorio de contenido de Java es una API para acceder a repositorios de contenido en Java SE, independientemente de su implementación.
  • Estos repositorios son sistemas de gestión de información de alto nivel y son versiones ampliadas de los repositorios de datos clásicos. Enumeraciones
  • (enumeración) es un tipo de datos que le permite describir varios elementos de datos como un conjunto escrito de constantes. Genéricos(tipos genéricos) le permiten crear clases con parámetros (tipos abstractos) que se especifican en la etapa de creación de instancias. Para obtener más información, consulte este artículo y también consulte este artículo sobre cómo los tipos genéricos facilitan el trabajo con colecciones en Java SE 6.0.
  • Utilidades(JAXP) es una API que permite a las aplicaciones Java analizar y transformar documentos XML, independientemente del procesador XML utilizado. Esto permite que las aplicaciones cambien fácilmente entre diferentes procesadores sin cambios en el código de la aplicación. A su vez, la tecnología JAXB ( API de Java para enlace XML) proporciona capacidades para automatizar el mapeo de documentos XML y objetos Java.
  • SOAP con API de archivos adjuntos para Java(SAAJ) proporciona a los desarrolladores funciones para generar y procesar mensajes de acuerdo con la especificación SOAP 1.1 con la indicación SOAP con archivos adjuntos (SOAP con archivos adjuntos). Para obtener más detalles, consulte el artículo).

Tecnologías incluidas en J2EE:

  • JavaBeans empresariales(EJB) es un modelo basado en componentes que simplifica el desarrollo de middleware al proporcionar servicios como gestión de transacciones, seguridad y conectividad de bases de datos.
  • Especificación del portlet define un conjunto de API para la creación de portales en Java, cubriendo aspectos como la agregación y presentación de información, la personalización y la seguridad (ver artículo).
  • Correo Java es una API que proporciona un conjunto de clases abstractas que modelan el sistema de correo.
  • Servicio de mensajes Java(JMS) es una API que admite la creación de aplicaciones Java portátiles basadas en un mecanismo de mensajería. Define un conjunto común de conceptos básicos y estrategias de programación para todos los sistemas de mensajería compatibles con JMS.
  • Caras del servidor Java(JSF) proporciona un modelo de programación que le ayuda a crear aplicaciones web ensamblando páginas a partir de componentes de interfaz de usuario reutilizables, asociando esos componentes con fuentes de datos y conectando eventos del lado del cliente con controladores del lado del servidor. Para obtener más información, consulte la guía de dos partes y la serie de columnas.
  • Páginas del servidor Java(JSP) proporciona a los desarrolladores web los medios para crear rápidamente y mantener fácilmente páginas web dinámicas multiplataforma que separan la interfaz de usuario y la generación de contenido para que los diseñadores puedan cambiar el marcado sin afectar el contenido generado dinámicamente (consulte el tutorial).
  • Biblioteca de etiquetas estándar para páginas JavaServer(JSTL) es un conjunto de etiquetas especializadas que proporcionan un formato estándar para realizar acciones requeridas por muchas aplicaciones web. Consulte el artículo Actualice sus páginas JSP con JSTL y la serie de cuatro partes denominada .
  • Servlets Java ampliar la funcionalidad de los servidores web proporcionando un enfoque multiplataforma basado en componentes para crear aplicaciones web libres de las limitaciones de rendimiento de CGI.
  • Arquitectura del conector J2EE(JCA) proporciona una arquitectura estándar para conectar aplicaciones J2EE a sistemas de información empresarial (EIS) heterogéneos. Esta arquitectura define un conjunto de mecanismos escalables y seguros basados ​​en transacciones mediante los cuales los proveedores de EIS pueden proporcionar adaptadores de recursos estándar para su inclusión en un servidor de aplicaciones. Para obtener información más detallada, consulte los artículos y el manual.
  • Especificación de gestión J2EE(JMX) define el modelo de información de gestión para la plataforma J2EE. Este modelo fue diseñado específicamente para interactuar con muchos sistemas y protocolos de control. Proporciona herramientas estándar para mapear el modelo de información común (CIM), la base de información de administración (MIB) SNMP y el modelo de objetos Java utilizando el componente EJB de administración J2EE (MEJB) residente.
  • API de transacciones de Java(JTA) es una API independiente del protocolo y de implementación de alto nivel que proporciona un medio para que los programas y servidores de aplicaciones accedan a las transacciones. Servicio de transacciones Java(JTS) define una implementación de administrador de transacciones que admite JTA e implementa un mapeo subyacente al servicio de transacciones de objetos OMG (Object Transaction Service - OTS 1.1).

La propagación de transacciones en JTS se implementa mediante el protocolo Inter-ORB (IIOP). Para obtener más detalles, consulte el artículo.

  • Tecnologías incluidas en J2ME: Perfil del dispositivo de información móvil
  • (MIDP) es una de las dos configuraciones que componen el tiempo de ejecución de Java para dispositivos móviles con recursos limitados. MIDP proporciona aplicaciones con una funcionalidad básica que incluye herramientas para crear interfaces de usuario, conectarse a recursos de red, almacenar datos localmente y gestionar ciclos de vida.(CDC) es un marco estandarizado para crear e implementar aplicaciones a las que pueden acceder muchos dispositivos integrados y en red.
  • API de gráficos 3D móviles para J2ME(M3G) es una API ligera de gráficos 3D interactivos que es un componente opcional de J2ME. Puede leer más sobre él en nuestra serie de dos partes.

Tecnologías Java y creación de aplicaciones web.

Durante muchos años, Java ha sido el lenguaje principal para el desarrollo de aplicaciones web. Recientemente, han aparecido muchos marcos y bibliotecas que facilitan la creación de aplicaciones web en Java, incluidas aplicaciones web 2.0 interactivas enriquecidas.

Consulte los recursos a continuación para temas sobre desarrollo web Java.

  • Los artículos de la columna hablan de Grails, una infraestructura moderna para crear aplicaciones web escritas en Groovy.
  • Grails le permite combinar perfectamente código Java previamente escrito con la capacidad de utilizar un lenguaje de programación flexible y dinámico. Se proporciona más información sobre Groovy a continuación en la sección ¿Qué tiene que ver Java con los lenguajes dinámicos y la programación funcional?
  • Ajax es una metodología de programación que utiliza lenguajes de secuencias de comandos del lado del cliente para comunicarse con un servidor web, lo que permite que las páginas actualicen información rápidamente sin tener que recargarlas por completo. Al leer esta serie de artículos, aprenderá cómo Ajax puede ayudarle como desarrollador de aplicaciones Java. Para obtener más información, puede visitar el sitio de DeveloperWorks.
  • JavaServer Faces (JSF) proporciona un modelo de programación que le ayuda a crear aplicaciones web ensamblando páginas a partir de componentes de interfaz de usuario reutilizables, asociando esos componentes con fuentes de datos y conectando eventos del lado del cliente con controladores del lado del servidor. Para obtener más información, consulte la guía de dos partes y la serie de columnas.
  • La plataforma de herramientas web Eclipse (WTP) amplía el popular entorno de desarrollo de Eclipse agregando herramientas para crear aplicaciones web basadas en tecnologías Java EE (consulte la guía).

Hay muchos otros materiales excelentes sobre estos temas en DeveloperWorks.

La arquitectura orientada a servicios (SOA) es un modelo de componentes que vincula los módulos funcionales de una aplicación (conocido como servicios de donde viene el término servicios web) a través de interfaces y contratos estrictamente descritos. Las definiciones de interfaz son independientes del hardware utilizado, el sistema operativo y el lenguaje de programación en el que se implementa el servicio, lo que permite una interacción unificada entre servicios que son componentes de diferentes sistemas. SOA es un ejemplo de un modelo de software débilmente acoplado que proporciona una alternativa a los modelos clásicos orientados a objetos estrechamente acoplados.

Los servicios web creados según este principio permiten describir reglas y procesos comerciales en XML, de modo que la interacción de la aplicación se puede llevar a cabo independientemente de las plataformas y lenguajes de programación utilizados. Las tecnologías XML promueven la portabilidad de los datos y simplifican la creación de mensajes, mientras que las tecnologías Java le permiten escribir código portátil. XML y Java funcionan bien juntos y, por lo tanto, representan una combinación ideal de tecnologías para crear e implementar servicios web.

Se puede obtener información más detallada leyendo los siguientes materiales:

  • Las páginas y el sitio de DeveloperWorks pueden ayudarle a navegar por estas tecnologías complejas.
  • Los artículos de la serie hablan sobre marcos de servicios web en Java, así como sobre nuevas capas funcionales creadas sobre estos servicios.
  • Este artículo proporciona una introducción al estilo elegante de diseño de servicios web llamado Transferencia de estado representacional (REST) ​​y analiza el uso de Java para crear servicios web utilizando los principios REST.
  • Comprender la tecnología JAX-RPC (RPC basada en API XML de Java) es esencial para crear servicios web eficientes en Java.
  • JAX-WS es el siguiente paso obvio en la evolución de JAX-RPC.
  • En el tutorial se ofrece una introducción práctica a esta nueva API.
  • Esta serie de artículos proporciona orientación sobre la arquitectura de componentes de servicio (SCA), una especificación que describe un modelo para desarrollar aplicaciones y sistemas utilizando principios SOA.

Este artículo proporciona una introducción al marco de Service Data Objects, que simplifica el modelo de datos Java EE al crear aplicaciones SOA.

Muchos desarrolladores que empiezan a aprender Java tienen una amplia experiencia con otros lenguajes de programación. Al mismo tiempo, incluso los programadores más experimentados admiten que Java no es el lenguaje ideal para resolver todos problemas encontrados en la práctica. Afortunadamente, con el soporte de JVM, puede aprovechar al máximo los lenguajes funcionales y los scripts dinámicos modernos al desarrollar aplicaciones para la plataforma Java. La flexibilidad y el dinamismo de estos lenguajes resultan muy útiles a la hora de crear prototipos e implementar determinados tipos de aplicaciones.

Puede leer más sobre las posibilidades de utilizar lenguajes dinámicos y funcionales en la plataforma Java en los materiales vinculados a continuación.

  • El lenguaje de secuencias de comandos Groovy permite a los desarrolladores de Java utilizar las bibliotecas y construcciones de lenguaje más comunes, al tiempo que proporciona un entorno de desarrollo dinámico y flexible que no requiere compilación, simplifica la sintaxis y admite secuencias de comandos dentro de aplicaciones Java normales. En los artículos de la serie se proporciona una descripción detallada de las capacidades de este lenguaje.
  • La nueva Script API en Java SE 6, que es compatible con Java SE 5 y contiene un pequeño conjunto de interfaces y clases, proporciona una manera fácil de llamar scripts escritos en docenas de lenguajes desde código Java. Con él, puede cargar y llamar scripts externos en tiempo de ejecución, cambiando dinámicamente el comportamiento de la aplicación. Puede leer más sobre esta API en una serie de dos partes llamada .
  • ¿Es usted un ferviente partidario de la programación funcional? Entonces deberías prestar atención a la columna que habla sobre Scala, un lenguaje de programación para JVM que combina enfoques de desarrollo funcional y orientado a objetos.
  • Las máquinas virtuales han soportado lenguajes de programación alternativos durante mucho tiempo. En los artículos de la columna puede leer sobre implementaciones para JVM de lenguajes como Rexx, Ruby, JavaScript, Python y algunos otros.

Java y creación de software libre.

Hay innumerables bibliotecas, herramientas, marcos, programas y servidores de aplicaciones disponibles en Java que brindan a los desarrolladores oportunidades adicionales para utilizar esta poderosa plataforma. Con el tiempo, se han incorporado a la plataforma Java una serie de tecnologías libres, y otras han seguido siendo populares entre los desarrolladores de Java a lo largo de los años, sirviendo en algunos casos como estándares de facto.

  • La Apache Software Foundation reúne muchos proyectos de código abierto, la mayoría de los cuales se desarrollan en base a tecnologías Java.
    • A continuación se enumeran algunos representantes de esta familia de proyectos.
    • Apache Struts es un marco para la creación de aplicaciones web cuya arquitectura sigue el principio Modelo-Vista-Controlador.
    • Apache Shale(EN) es otra infraestructura moderna para la creación de aplicaciones web, que es la sucesora de Struts y se basa en la tecnología JSP (JavaServer Pages). En los artículos de la serie se proporciona una introducción a Shale.
    • Apache Ant es el estándar de facto para automatizar el proceso de construcción de aplicaciones Java.
    • La herramienta de compilación Apache Maven fue diseñada para satisfacer las demandas de los proyectos de software modernos, que se caracterizan por la colaboración dinámica entre equipos de desarrollo y la dependencia de múltiples componentes compatibles de forma independiente (consulte el tutorial).
    • Apache Tomcat es un contenedor web popular que admite servlets y páginas de servidor Java (JSP).
    • El proyecto Apache Geronimo consiste en crear un servidor de aplicaciones Java EE totalmente compatible con las especificaciones y basado íntegramente en tecnologías libres. Puede leer más sobre Geronimo en este artículo, así como en el sitio de DeveloperWorks, que contiene una gran cantidad de material útil.
  • Eclipse(EN) es una plataforma de desarrollo abierta e independiente y un conjunto de herramientas básicas para la creación de software. Está escrito en Java y proporciona una infraestructura basada en complementos que facilita el desarrollo, la integración y el uso del software. IBM es miembro fundador de Eclipse.org y participa activamente en la junta directiva y los subcomités del proyecto. Puede leer sobre algunas de las tecnologías de componentes de la plataforma Eclipse destinadas a crear aplicaciones Java en los siguientes materiales:
    • AspectJ(EN) es una extensión orientada a aspectos del lenguaje Java que se puede utilizar para modularizar funciones transversales como el registro o el manejo de excepciones.
    • Standard Widget Toolkit(EN) (SWT) es un conjunto de herramientas que le permite aprovechar las capacidades de su sistema operativo para crear elementos de interfaz de usuario de una manera eficiente y portátil.
    • Mylyn(EN) es un potente sistema de gestión de trabajos para usuarios de Eclipse. En los artículos se proporciona orientación detallada y, anteriormente conocida como Acegi Security for Spring, es una solución poderosa y flexible para brindar seguridad a aplicaciones empresariales construidas sobre la infraestructura Spring. Se analiza en detalle en cuatro artículos de la serie.
  • Sun Microsystems también comenzó a trabajar en , lanzando los siguientes proyectos públicos en el sitio web java.net(EN):
    • AbiertoJDK

¿Cómo desarrollar habilidades de programación Java?

Hay dos formas principales de desarrollar sus habilidades de programación Java: realizar un curso de formación especial (con posibilidad de certificación) o aprender Java por su cuenta practicando la escritura de código. Los cursos de formación no sólo le permiten aprender de la experiencia de desarrolladores calificados, sino que también le brindan la oportunidad de obtener un certificado que puede convencer a un empleador potencial de que tiene las habilidades necesarias para resolver los problemas técnicos que enfrentamos. Al hacerlo, podrás profundizar tus conocimientos en diversas áreas de Java experimentando por tu cuenta y utilizando todos los recursos disponibles. Cualquiera que sea el camino que elija, los siguientes recursos le ayudarán.

  • Guías y artículos
    • desarrolladorWorks tiene una extensa colección de herramientas que son superadas solo por la codificación por su cuenta en términos de utilidad para aprender Java.
    • Los artículos son una serie y son excelentes para mejorar sus habilidades en Java.
    • En los artículos de la serie se analiza la aplicación de la teoría del diseño a la creación de aplicaciones del mundo real.
    • Los desarrolladores de Java experimentados crean sus aplicaciones de antemano con herramientas de depuración y prueba. El sitio desarrolladorWorks presenta varios artículos de la serie: se trata de juegos en tiempo real basados ​​en la plataforma Eclipse, destinados a aprender programación Java. Para obtener una introducción a CodeRuler, consulte el artículo Conquistando reinos medievales con CodeRuler (EN).
  • Cursos de formación técnica de IBM
    • Ofrecemos una amplia gama de cursos Java online, presenciales y multimedia de IBM Global Services.
  • Proceso de dar un título
    • Puede realizar varios exámenes para obtener certificaciones que demuestren sus habilidades de programación Java. Los materiales sobre los cursos que conducen a la certificación se pueden encontrar en el sitio web de Java Certification(EN).
    • IBM ofrece oportunidades para desarrollar sus habilidades en tecnologías relacionadas con Java, como el desarrollo de aplicaciones empresariales para WebSphere, software Rational, DB2, XML y SOA.
  • Foros
    • Moderado por expertos con años de experiencia en tecnologías Java, esta es la forma más interactiva de aprender Java.

Productos y tecnologías de IBM para desarrolladores de Java

IBM es uno de los líderes en la aplicación práctica de tecnologías Java.

  • A continuación se encuentran enlaces a algunos de los productos y tecnologías de IBM disponibles para los desarrolladores de aplicaciones de la plataforma Java.
    • Productos descargables gratis:
    • (Java Developer Kit) es un conjunto de herramientas para crear y probar subprogramas y aplicaciones para Java SE y Java ME en una variedad de sistemas operativos populares, incluidos Windows, Linux y AIX.
    • (Paquete de desarrollo de IBM para Eclipse) es un kit de herramientas de desarrollo no compatible basado en Eclipse que le permite crear y ejecutar aplicaciones en su propio entorno de desarrollo listo para usar.
    • Nota: Puede descargar paquetes de software gratuitos de Eclipse desde desarrolladorWorks, incluidos los productos paralelos Calisto y Europa.
    • . Esta utilidad le ayuda a analizar y generar scripts Ant comprobables para crear proyectos desarrollados con IDE de Eclipse, Rational y WebSphere para las plataformas Java EE y SCA.
    • (Herramienta de análisis y modelado de patrones de IBM para Java Garbage Collector). Esta utilidad analiza archivos de seguimiento de GC detallados, analiza el uso de la memoria dinámica (montón) y recomienda configuraciones de aplicaciones basadas en los resultados de simulación de memoria obtenidos. (Secure Shell Library para Java) es una implementación ligera del protocolo SSH-2 desarrollado por Internet Engineering Task Force (IETF). Proporciona autenticación segura y otros servicios seguros a través de una red no segura. Le permite consolidar y transformar datos, aumentando así la productividad, flexibilidad y rendimiento de su negocio a través del acceso rápido a la información que necesita.

¿Qué es la seguridad de la información? Se trata de un estado de seguridad de la información que garantiza su confidencialidad, disponibilidad e integridad.

Normalmente, para evaluar el estado de la seguridad de la información, es necesario comprender y analizar las amenazas y sus fuentes, evaluar el nivel de daño, la probabilidad de implementación y la relevancia de las amenazas, riesgos (opcional) que pueden afectar nuestro sistema/información. .

En mi opinión, es imposible evaluar la seguridad de una única tecnología o lenguaje de programación sin hacer referencia a un método de implementación específico, es decir, sin un producto de software específico listo para usar en un lenguaje que tenga una especificación técnica detallada que describa la arquitectura y funcionalidad. Pero esto tampoco será suficiente, ya que es necesario evaluar el estado de seguridad de un sistema de información terminado con su arquitectura específica, conjunto de componentes, procesos de negocio, información y, finalmente, personas. Déjame darte un ejemplo de cómo construir una casa. Disponemos de materiales (arena, cemento, piedra triturada, ladrillo, etc.) y herramientas (cubo, pala, llana, etc.). No podemos evaluar la calidad y confiabilidad de una casa terminada únicamente por los materiales/herramientas utilizados: cuánto durará, si tendrá grietas, si hará frío o silencio. Debe elegir el diseño de la casa, la tecnología de construcción y un equipo de artesanos. Y solo después de finalizar la construcción podremos medir el cumplimiento del proyecto, GOST, SNiP, verificar las mediciones de protección térmica, ruido, cargas, analizar la calidad del cemento y responder la mayoría de las preguntas. Pero la pregunta principal es “¿cuánto durará?” No tendremos una respuesta exacta, ya que desconocemos todas las condiciones de funcionamiento de la casa y todos los factores que influirán a lo largo de todo el tiempo.

Cómo estar seguro en Java

Tomemos Java por ejemplo . Es un lenguaje de programación orientado a objetos; Los programas escritos en Java se traducen a código de bytes de Java, ejecutados por la máquina virtual Java (JVM), un programa que procesa el código de bytes y pasa instrucciones al hardware como intérprete. La ventaja de este método de ejecutar programas es la total independencia del código de bytes del sistema operativo y el hardware, lo que le permite ejecutar aplicaciones Java en cualquier dispositivo para el que exista una máquina virtual correspondiente.

« "Universal Language" suena bien, pero el problema más común es también la otra cara de la moneda: pérdidas de memoria en la JVM, lo que provoca un desbordamiento de la memoria y fallas. En relación con este problema, no se pueden descartar vulnerabilidades, porque el principio principal de la confiabilidad es que cuanto más simple, mejor. En este caso, la tarea de garantizar la compatibilidad de una gran cantidad de plataformas y sistemas operativos es tan compleja que es casi imposible rastrear y cerrar todas las vulnerabilidades encontradas en ellos y eliminarlas rápidamente. Para Microsoft, las vulnerabilidades se pueden encontrar y corregir después de 4 a 8 años, y esto no tiene en cuenta las capacidades no declaradas dejadas intencionalmente o por error.

Según mi experiencia: cuando los programadores agregan nuevas funciones relacionadas con algo ya implementado, o corrigen funciones antiguas, en el 15% de los casos estropean un producto que anteriormente funcionaba. Y si no se llevan a cabo pruebas completas, el resultado final es un producto con nueva funcionalidad, pero con la antigua parcialmente sin funcionar. También existen diferencias en la escritura de código para diferentes plataformas, versiones de sistema operativo y software. En este sentido, puedes imaginar lo difícil que es mantener el lenguaje de programación Java y JVM, sin mencionar los problemas de seguridad.

Actualmente se ha lanzado Java Development Kit 10, que nos ofrece mecanismos de seguridad estándar liberados para Java SE 8 y descritos en la Documentación de Seguridad. La décima versión no añadió nada nuevo.

Observo que Oracle tiene un Centro de recursos de seguridad de Java. En general, la empresa divide la seguridad de Java en cuatro secciones principales:

A) los desarrolladores deben:

Supervise y utilice las últimas actualizaciones de desarrollo y seguridad;

Utilice programas de control de la corrección del código (por ejemplo, Checker Framework);

B) los administradores del sistema deben:

Supervisar y utilizar las últimas actualizaciones de Java y los componentes necesarios para que el producto funcione (incluido el sistema operativo, bibliotecas, marcos, etc.);

Utilice las reglas de implementación de Java descritas por y ;

Utilice una marca de tiempo confiable.

B) los usuarios finales deben:

Utilice siempre la última versión original de Java;

D) los profesionales de la seguridad necesitan:

Utilice herramientas avanzadas de administración y seguridad (por ejemplo, Advanced Management Console);

Supervisar la instalación oportuna de todas las actualizaciones de seguridad;

Es importante que todos sigan y cumplan las normas y requisitos de seguridad. Es posible alcanzar un estado de seguridad a un nivel adecuado sólo juntos y utilizando todas las medidas disponibles (técnicas, organizativas). Como muestra mi práctica, en el 60% de las organizaciones, los servicios de seguridad de la información y TI están bien con la seguridad, así como con los usuarios que usan dispositivos corporativos y están conectados a un solo dominio. Pero los más descontrolados en este ámbito son los desarrolladores, los jefes de equipo y los arquitectos.

Problemas de seguridad y desarrollo de software

De manera más amplia, las principales causas de los problemas de seguridad en las aplicaciones durante el desarrollo de software son las siguientes:

A) Falta de comprensión de la terminología de seguridad en general, sin mencionar los conocimientos específicos y las soluciones aplicadas.

Como regla general, los desarrolladores, en el mejor de los casos, asocian la seguridad con las siguientes cosas: administración de acceso y registro y protección con contraseña, con menos frecuencia, seguridad de la conexión a nivel https (utilizando mecanismos de cifrado que están disponibles de forma predeterminada). Es decir, formalmente utilizarán métodos de seguridad, que de hecho seguirán siendo formales, "para mostrar", sin tener en cuenta los requisitos y matices:

Para las contraseñas: se suelen utilizar valores predeterminados y no se configura adicionalmente la longitud, fuerza, frecuencia de cambio, no repetición y número de intentos. Muy a menudo, estos parámetros no se pueden ajustar más, ya que no estaban incluidos en el alcance de la tarea de desarrollo de software, lo que lleva a la necesidad de agregar código.

En cuanto a la gestión de acceso y el registro: en el mejor de los casos, los desarrolladores describieron grupos o roles de usuarios y objetos de acceso que deberían estar disponibles en el software. En el peor de los casos, los propios desarrolladores "dividieron" secciones y objetos en los que necesitaban los usuarios y administradores. En el primer caso, obtenemos un sistema que se puede configurar de manera flexible, pero que requiere una cantidad significativa de tiempo para configurarlo y acordar los derechos. En el segundo, un sistema formal de control de acceso. Además, los desarrolladores deben comprender qué información se debe registrar y en qué medida. Sin embargo, a menudo no se les proporciona esta información, lo que genera registros que no son lo suficientemente detallados como para investigar incidentes o comprender lo que sucede en el software. O al almacenamiento excesivo de registros y una gran cantidad de información, lo que impone restricciones significativas a la capacidad de almacenar información durante el período de tiempo requerido (por ejemplo, de uno a tres años) o existe la necesidad de comprar instalaciones adicionales para almacenar información. Cuando la información se registra en exceso, surgen problemas adicionales con la velocidad de análisis y análisis de las incidencias y la rapidez para encontrar la información necesaria. El despido también puede requerir financiación adicional para ampliar el personal, comprar sistemas SIEM con el establecimiento de reglas únicas para procesar la información o generar riesgos asociados con información desactualizada. Al mismo tiempo, se dedica demasiado tiempo al análisis y procesamiento de información.

La protección de los canales de comunicación es un punto igualmente importante, especialmente para los sistemas bancarios y de pago, donde además de la divulgación de datos personales y privados, es posible que se produzcan pérdidas financieras. La mayoría de las veces sucede que no piensan en proteger los canales y el medio de transmisión de información y, si lo hacen, utilizan la configuración "predeterminada", por ejemplo, TLS/SSL. Pero también tiene sus propias peculiaridades en cuanto a la elección de la versión del protocolo (TLS 1.1, 1.2, 1.3 o SSL v1-3), el algoritmo de cifrado (RC4, IDEA, Triple DES, SEED, Camellia o AES) y la longitud de la clave. A veces, por ejemplo, se selecciona el protocolo TLS 1.2 correcto, con cifrado AES, una longitud de clave de 256 bits, pero se olvida la posibilidad de seleccionar una dirección en el puerto 443 para HTTPS o el puerto 80 para HTTP, en lugar de bloquear el puerto 80. , lo que hace posible obtener acceso a través de un canal no seguro. O, por ejemplo, construyen infraestructura en máquinas virtuales y no piensan en absoluto en la necesidad de cerrar el acceso a la red entre máquinas virtuales.

B) El segundo problema está relacionado con el negocio, ya que invierte dinero en una funcionalidad especial específica que no tiene en cuenta los bloques de seguridad.

Desafortunadamente, las empresas no siempre entienden por qué deberían gastar recursos en unidades de seguridad si no tienen ningún beneficio funcional, el producto no generará más dinero y solo existen riesgos probables de que no funcionen. Las empresas suelen comprender con mayor frecuencia la necesidad de invertir en seguridad cuando ya ha ocurrido un incidente de seguridad de la información.

Desafortunadamente, esto no es sólo culpa de la empresa, sino también de su entorno, que:

Tampoco entiende de seguridad;

Se ha ahorrado el presupuesto para especialistas en seguridad de la información (no se contratan en absoluto, o se contratan especialistas altamente especializados, o se contrata a una persona que se encarga de todo);

No se pudo transmitir de manera convincente la necesidad de seguridad y justificar correctamente los riesgos actuales (reputacionales, financieros, de tiempo).

C) Problema de comunicación en la empresa o falta de ella.

Este es el caso cuando una empresa y su entorno comprenden la necesidad y la importancia de la seguridad de la información. Han asignado presupuestos y contratado a los especialistas adecuados, pero surgen dificultades en la comunicación entre las unidades de negocio y los servicios y desarrolladores de seguridad de la información/TI.

D) Desconocimiento de los usuarios comunes de la empresa en temas de seguridad de la información.

Supongamos que existen todas las unidades, especialistas, medidas técnicas y organizativas necesarias. Pero los usuarios son tercos y no quieren trabajar según las reglas. Esta es una situación muy común, y también necesita una solución integral, ya que las personas no entienden por qué necesitan un trabajo extra para cumplir con los problemas de seguridad de la información (escanear archivos con un antivirus, recordar contraseñas complejas, conocer y cumplir con las políticas y negocios). procesos, etcétera). Es necesario organizar periódicamente clases magistrales, explicar a nivel cotidiano qué es la seguridad de la información, qué problemas y soluciones existen, comunicar las metas y objetivos globales de la seguridad de la información, su impacto en los negocios y motivar.

E) Falta de arquitectos de seguridad de la información: los especialistas en seguridad de la información no siempre participan en el desarrollo de software y los propios programadores piensan en la seguridad de la arquitectura y el uso de patrones de seguridad escritos y listos para usar.

Los desarrolladores no conocen ni pueden conocer todos los matices, ya que su tarea es completar el desarrollo y pasar al siguiente. Si profundizas en el desarrollo en sí, el proceso es mucho más complicado de lo que parece. Por lo tanto, es necesario recibir claramente una tarea de la empresa, descomponerla en minitareas comprensibles para los desarrolladores, realizar el desarrollo, realizar pruebas alfa y beta, cargar, pruebas funcionales, corregir errores, volver a las pruebas; este proceso es cíclico. y largo. Por tanto, no es de extrañar que no dispongan de recursos suficientes para pensar en la seguridad del producto hasta el más mínimo detalle.

Para poder hablar de seguridad es necesario solucionar los problemas descritos anteriormente. No describo específicamente opciones de solución, ya que todo depende de problemas, entorno y condiciones específicos. No existe una pastilla universal y hay que utilizar todas las medidas posibles. La tarea principal es garantizar que todos los empleados de la empresa comprendan, comprendan y cumplan con los requisitos de seguridad de la información y estén interesados ​​​​en cumplirlos. Y solo así será posible hablar de la efectividad y el buen nivel de madurez en seguridad de la información en la empresa.

Esta sección consta de seis partes. Se analizan las cuestiones de seguridad de la informática distribuida en general y se considera el problema de seguridad asociado con el código ejecutable. Se proponen seis pasos para construir un mecanismo de seguridad viable y flexible. También se analiza la implementación de mecanismos de seguridad en la arquitectura del lenguaje Java. Como ocurre con cualquier tecnología nueva, existen preguntas abiertas sobre la seguridad en Java que todavía se están discutiendo en la Web y otros foros.

Esta sección examina el concepto de seguridad en el contexto general de la interacción en la Web y la implementación de la seguridad a través de código ejecutable.

Veamos primero la dualidad de la seguridad con respecto a la Web y la evolución de la Web como medio en el contexto de esa dualidad. Luego podrá comenzar a describir el problema de seguridad en el contexto del código ejecutable.

Un programa obtenido de la red debe inspirar un cierto nivel de confianza por parte del usuario. Se le proporcionan algunos recursos informáticos; de lo contrario, no podrá realizar ninguna acción útil. Sin embargo, este programa fue escrito por alguien que no tiene obligaciones formales con el usuario. Si esta persona es un hacker, entonces el código ejecutable resultante podría ser un programa potencialmente peligroso con las mismas capacidades que un programa local.

¿Debería el usuario aislar completamente el programa externo de los recursos de la computadora? Por supuesto que no. En tal caso, el código ejecutable no podría hacer nada útil. Una solución más completa y eficaz al problema de seguridad se puede dividir en seis etapas:

1. Anticipar acciones y métodos de intrusión potencialmente peligrosos.

2. Reducir cualquier acción peligrosa a un conjunto mínimo de operaciones simples.

3. Construir un entorno de programación y un lenguaje informático que prohíba explícitamente un conjunto mínimo de operaciones peligrosas y, por tanto, cualquier acción maliciosa.

4. Demostrar lógicamente o, si es posible, mostrar lo más obvio que el lenguaje y el entorno están efectivamente protegidos contra métodos de intrusión deliberada.

5. Implementar el lenguaje y permitir que los programas ejecutables utilicen solo ese lenguaje seguro aprobado.

Los escenarios de ataques externos se pueden dividir en los siguientes grupos (la lista no está completa):

· Daño o violación de la integridad de los datos y/o del estado del programa en ejecución;

· Recopilar o copiar información confidencial;

· Bloqueo de recursos, como resultado del cual se vuelven inaccesibles para usuarios y programas legítimos;

· Captura de recursos y su uso por un programa externo no autorizado;

· Creación de situaciones no fatales que reducen el rendimiento, especialmente en dispositivos de salida;

· Asignar derechos de acceso y utilizarlos o el ordenador del cliente para invadir otros elementos de la red.

en la mesa 1.1 enumera los recursos potencialmente vulnerables, así como los tipos de impactos que pueden utilizarse en relación con ellos. Una buena estrategia de seguridad asigna una puntuación de riesgo a cada recurso y desarrolla métodos para que los programas ejecutables externos accedan a ellos.

Cuadro 1.1 Objetos potencialmente vulnerables y tipos de impacto

violación de integridad

Interceptación de información

Bloquear/Cambiar derechos

Captura de recursos

Interferencia no fatal

Toma de poderes

Sistema de archivos

violación de integridad

Interceptación de información

Bloquear/Cambiar derechos

Captura de recursos

Interferencia no fatal

Toma de poderes

Información confidencial

Central

UPC

Dispositivos de salida

Dispositivos de entrada

SO, estado del programa

En lugar de considerar todos los métodos de intervención posibles, el esquema de protección de Java identifica los objetos vulnerables de las principales operaciones potencialmente peligrosas, lo que se acerca mucho al enfoque descrito anteriormente.

En concreto, el esquema de seguridad del lenguaje Java considera los siguientes objetos vulnerables:

· Memoria;

· Estado del sistema operativo/programa;

· Sistema de archivos del cliente;

· En este caso se tienen en cuenta los siguientes tipos de intervenciones, enumeradas en la tabla. 1.1;

· Violación de la integridad de los programas en la máquina cliente. Generalmente causado por virus que se escriben en la memoria y destruyen ciertos archivos cuando ocurre algún evento o se alcanza una fecha determinada;

· Bloquear/cambiar derechos para usar los recursos de la máquina cliente. Generalmente causado por virus;

· Intercepción de información en la máquina cliente. Por ejemplo, se hace fácilmente usando el comando UNIX SENDMAIL;

· Aprovechar los privilegios de la máquina cliente. Esto se logra sustituyendo direcciones IP. Este tipo de ataque informático fue inventado por Kevin Mitnick cuando hackeó uno de los ordenadores personales del experto en seguridad Tsutumo Shimura. Todo el incidente se detalla en el libro más vendido del New York Times, Showdown, escrito por Sutumo Shimura.

El primer nivel de seguridad en Java es la arquitectura del lenguaje mismo, las construcciones sintácticas y semánticas del lenguaje. A continuación, se analiza la estructura del lenguaje Java desde una perspectiva de seguridad.

Java es un lenguaje orientado a objetos completo; cada estructura de datos (y por lo tanto derivada de ella) es un objeto verdadero y completamente funcional. El hecho de que cada estructura de datos primitiva esté enmarcada como un objeto garantiza que todos los beneficios teóricos de seguridad de los lenguajes OOP estén presentes en los programas escritos en Java, incluida su sintaxis y semántica:

· Encapsulación y ocultación de datos en anuncios privados;

· Acceso controlado a estructuras de datos, en las cuales; sólo se utilizan métodos públicos;

· Extensibilidad y construcción jerárquica de una estructura de programa compleja;

· Sin sobrecarga de operaciones.

Las clases y los métodos pueden declararse finales, prohibiendo así la creación de subclases y métodos anulados. Esta declaración evita modificaciones maliciosas del código probado.

Por razones de seguridad, el encasillamiento se comprueba tanto de forma estática como dinámica; esto garantiza que el tipo de objeto declarado en tiempo de compilación coincidirá exactamente con el tipo de objeto en tiempo de ejecución, incluso si se han realizado operaciones de conversión de tipos en ese objeto. Los controles de conversión de tipos evitan la sustitución intencional de tipos de datos.

Esta característica, implementada directamente en el lenguaje Java, es probablemente la principal garantía de seguridad. La ausencia de punteros en un programa Java garantiza que todos los elementos de datos siempre tengan un nombre. Cada estructura de datos simple o fragmento de código tiene un identificador que le permite controlarlo por completo.

Java es un lenguaje de subprocesos múltiples y proporciona acceso seguro para subprocesos a estructuras y objetos de datos. El Capítulo 14 analiza los subprocesos de Java en detalle y proporciona programas de aplicación de muestra.

Cada objeto en el lenguaje Java tiene un código hash único asociado. Esto significa que el estado de un programa Java se puede controlar en cualquier momento.

El tiempo de compilación examina todos los mecanismos de protección que existen en la sintaxis del lenguaje Java, incluida la verificación de que las declaraciones públicas y privadas sean consistentes, que los tipos sean correctos y que todas las variables estén inicializadas con valores predefinidos.

Las clases fuente de Java se compilan en códigos de bytes. El verificador de código de bytes realiza muchas comprobaciones de coherencia y seguridad en el código compilado. Al verificar los códigos de bytes, se realizan las siguientes operaciones:

· Verifique el desbordamiento de la pila y el desbordamiento del puntero de la pila;

· Análisis de acceso a registros;

· Comprobación de la exactitud de los parámetros del código de bytes;

· Análisis de flujos de bytecode creados por métodos, que asegura la integridad de la pila, verificando los objetos recibidos y los objetos devueltos por los métodos.

Las clases de Java se describen dentro de los paquetes. Los nombres de las clases están asociados con los nombres de los paquetes. Los paquetes garantizan que el código recibido de la red sea diferente del código local. Una biblioteca de clases aceptada no puede reemplazar ni secuestrar, por error o intencionalmente, bibliotecas locales de clases validadas, incluso si esas bibliotecas tienen el mismo nombre. Esto también protege contra interacciones accidentales no probadas entre las clases locales y aceptadas.

El enlace tardío garantiza que la ubicación exacta de los recursos en tiempo de ejecución se produzca en el último momento. El enlace tardío presenta una barrera importante a los ataques externos debido a convenciones especiales con respecto a la asignación de memoria para estos recursos.

De forma predeterminada, el mecanismo de carga activa Java-ioiaccoB se utiliza para recuperar la clase especificada de un archivo ubicado en la máquina host local.

Cualquier otro método de carga de clases, incluida la transferencia a través de la red, requiere la presencia de una clase ClassLoader adecuada. ClassLoader es una subclase de la clase estándar Java ClassLoader, que tiene métodos que implementan todos los mecanismos de coherencia y seguridad y se ejecutan para cada clase recién cargada.

Por razones de seguridad, la clase ClassLoader no puede realizar ninguna acción de anticipación en códigos de bytes. Los códigos de bytes se pueden obtener de un programa Java traducido por un compilador de Java o un compilador de C++ modificado para producir códigos de bytes. Esto significa que ClassLoader solo se ejecuta después de que se haya verificado el código de bytes entrante; esta clase es responsable de crear un espacio de nombres para el código cargado y resolver las referencias de nombres de clases abordadas en el código resultante. Esto crea espacios de nombres separados para cada paquete.

En C y C++, el programador asigna memoria explícitamente, la libera y realiza un seguimiento de todos los punteros a la memoria asignada. Esto a menudo complica el mantenimiento del programa y es una fuente importante de errores que conducen a referencias colgantes causadas por el uso de punteros nulos y operaciones incorrectas de asignación y desasignación de memoria.

No hay punteros en el lenguaje Java, por lo que el programador no tiene que administrar la memoria explícitamente. La asignación y desasignación de memoria se realizan automáticamente, de manera estructurada y con una coherencia de tipos precisa. Para liberar memoria no utilizada, se utiliza la recolección de basura (desfragmentación de memoria) en lugar de operaciones programables explícitas. Esto elimina la posibilidad de errores de asignación de memoria y posibles problemas de seguridad. Al asignar y liberar memoria manualmente, son posibles operaciones ilegales de duplicación, clonación y confiscación de poderes de objetos disponibles, así como violaciones de la integridad de los datos.

La clase SecurityManager es un medio básico y extensible para construir sistemas de seguridad y proporcionar mecanismos de protección para otros componentes del lenguaje Java, incluidas bibliotecas de clases y entornos externos (por ejemplo, navegadores compatibles con Java y métodos dependientes de la máquina). La clase SecurityManager en sí no está diseñada para usarse directamente (de forma predeterminada, cada una de las comprobaciones genera algún tipo de excepción de seguridad); esta es una clase base para crear subclases que implementan un conjunto determinado de métodos de protección.

Entre otras características, la clase SecurityManager tiene métodos para reconocer procesos de verificación de seguridad, así como métodos para realizar las siguientes comprobaciones:

· Protección contra la instalación de cargadores de clases adicionales ClassLoader;

· Posibilidad de vincular bibliotecas dinámicas (utilizadas para código dependiente de la máquina);

· Lectura de un archivo de clase y escritura en un archivo de clase;

· Crear una conexión de red;

· Capacidad para conectarse a algún puerto de red;

· Permitir la conexión de red entrante;

· Disponibilidad de algún paquete;

· Agregar una nueva clase al paquete.

La principal fuente de peligro para Java-nporpaMM es el código Java que proviene de la red y se ejecuta en la computadora cliente. Estos Java-nporpaMMbi transportables se denominan subprogramas. Un subprograma de Java tiene un conjunto bien definido de capacidades y limitaciones a nivel de lenguaje, especialmente en términos de mecanismos de seguridad.

Los applets descargados a través de la red están sujetos a las siguientes restricciones:

· No puedes crear, cambiar el nombre o copiar archivos y directorios en el sistema de archivos local;

· No puedes crear conexiones de red arbitrarias, con la excepción de conexiones con la máquina host desde la que se leyeron los subprogramas. El nombre de host debe especificarse en la URL de la página HTML que contenía la etiqueta. , o especificado en el parámetro codebase de la etiqueta . No se permite una dirección IP numérica de la máquina host.

Las restricciones estrictas enumeradas sobre el acceso al sistema de archivos local se aplican a los subprogramas que se ejecutan en el entorno del navegador Netscape Navigator 3.0. En JDK 1.0 Appletviewer, las restricciones son menos restrictivas y el usuario puede definir explícitamente una lista de archivos sobre los que los subprogramas pueden operar.

Los applets pueden leer algunas propiedades del sistema llamando a system.getProperty (clave de cadena). Los applets en Netscape 3.0 tienen acceso ilimitado a estas propiedades. El Appletviewer JDK 1.0 de Sun le permite controlar individualmente el acceso a cada propiedad. en la mesa La Tabla 1.2 enumera la información devuelta para varios valores clave.

programa de aplicación de interfaz java

Tabla 1.2 Disponibilidad de variables del sistema

en la mesa La Tabla 1.3 enumera opciones que no están disponibles para los subprogramas en el entorno del navegador Netscape 3.0. El Appletviewer JDK 1.0 y el navegador HotJava permiten al usuario controlar el acceso a algunos de los recursos especificados.

Tabla 1.3 Variables del sistema no disponibles para subprogramas

El sistema Java carga subprogramas de dos maneras. El subprograma se puede transferir a través de la red o descargar desde el sistema de archivos local. La forma en que se carga el subprograma determina las capacidades que se le proporcionan.

Desde una perspectiva de seguridad, los subprogramas locales pueden hacer lo siguiente:

· Cargar bibliotecas en la máquina cliente;

· Ejecutar procesos externos en la máquina local;

· Detener el funcionamiento de la máquina virtual Java.



 Arriba