A maior rede de estudos do Brasil

Grátis
118 pág.
poojava

Pré-visualização | Página 11 de 37

através do comando throw, propagado para os métodos anteriores na pilha de
execução:
public double calculaDivisao (double numerador, int denominador)
throws DivideByZeroException {
if (denominador == 0)
throw new DivideByZeroException();
return numerador / denominador;
}
O mesmo comando throw pode ser utilizado para repassar uma exceção após sua captura — por
exemplo, após um tratamento parcial da condição de exceção:
public void usaDivisao()
throws DivideByZeroException {
...
try {
d = calculaDivisao(x, y);
}
catch (DivideByZeroException dbze) {
...
throw dbze;
}
...
}
Nesse caso, a informação associada à exceção (como o seu ponto de origem, registrado internamente
no atributo do objeto que contém a pilha de invocações) é preservada. Caso fosse desejado mudar
essa informação, uma nova exceção poderia ser gerada ou, caso a exceção seja a mesma, o método
fillInStackTrace() poderia ser utilizado, como em
throw dbze.fillInStackTrace();
2.7 O ambiente de Java
O ambiente de desenvolvimento de software Java, Java SDK (Software Development Kit — an-
tigamente, denominado JDK), é formado essencialmente pelas classes fundamentais da linguagem
Java e por um conjunto de aplicativos que permite, entre outras tarefas, realizar a compilação e a exe-
cução de programas escritos na linguagem Java. Não é um ambiente integrado de desenvolvimento,
não oferecendo editores ou ambientes de programação visual. No entanto, são suas funcionalidades
que permitem a operação desses ambientes.
O Java SDK contém um amplo conjunto de APIs que compõem o núcleo de funcionalidades
da linguagem Java. Uma API (Application Programming Interface) é uma biblioteca formada por
código pré-compilado, pronto para ser utilizado no desenvolvimento de suas aplicações.
c
�
2001 FEEC/UNICAMP 33
Programação orientada a objetos com Java 2.7. O ambiente de Java
2.7.1 Ferramentas do Java SDK
As ferramentas essenciais do ambiente de desenvolvimento de sofware Java são: o compilador
Java, javac; o interpretador de aplicações Java, java; e o interpretador de applets Java, appletviewer.
Um programa fonte em Java pode ser desenvolvido usando qualquer editor que permita gravar
textos sem caracteres de formatação. Um arquivo contendo código Java constitui uma unidade de
compilação, podendo incluir comentários, declaração relacionadas a pacotes e pelo menos uma defi-
nição de classe ou interface.
O resultado dessa execução, se o programa fonte estiver sem erros, será a criação de um arquivo
Hello.class contendo o bytecode que poderá ser executado em qualquer máquina.
Além das ferramentas essenciais, o Java SDK oferece os aplicativos de desenvolvimento javadoc,
um gerador de documentação para programas Java; jar, um manipulador de arquivos comprimidos no
formato Java Archive, que opera juntamente com extcheck, o verificador de arquivos nesse formato;
jdb, um depurador de programas Java; javap, um disassembler de classes Java; e javah, um gerador
de arquivos header para integração a código nativo em C.
Java oferece também aplicativos para o desenvolvimento e execução de aplicações Java em pla-
taformas de objetos distribuídos (ver Capítulo 5). Há também ferramentas para permitir o desen-
volvimento de aplicações distribuídas, incorporando também o conceito de assinaturas digitais. A
ferramenta keytool gerencia chaves e certificados; jarsigner gera e verifica assinaturas associadas a
arquivos Java; e policytool é uma interface gráfica para gerenciar arquivos que determinam a política
de segurança do ambiente de execução.
2.7.2 Geração de código portátil
Um dos grandes atrativos da plataforma tecnológica Java é a portabilidade do código gerado.
Esta portabilidade é atingida através da utilização de bytecodes. Bytecode é um formato de código
intermediário entre o código fonte, o texto que o programador consegue manipular, e o código de
máquina, que o computador consegue executar.
Na plataforma Java, o bytecode é interpretado por uma máquina virtual Java. A portabilidade
do código Java é obtida à medida que máquinas virtuais Java estão disponíveis para diferentes plata-
formas. Assim, o código Java que foi compilado em uma máquina pode ser executado em qualquer
máquina virtual Java, independentemente de qual seja o sistema operacional ou o processador que
executa o código.
A Máquina Virtual Java (JVM) é, além de um ambiente de execução independente de plataforma,
uma máquina de computação abstrata. Programas escritos em Java e que utilizem as funcionalidades
definidas pelas APIs dos pacotes da plataforma Java executam nessa máquina virtual.
Uma das preocupações associadas a execuções nessas máquinas virtuais é oferecer uma arquitetu-
ra de segurança para prevenir que applets e aplicações distribuídas executem fora de seu ambiente se-
guro (sandbox) a não ser quando assim habilitados. Um framework de segurança é estabelecido atra-
vés de funcionalidades dos pacotes java.security e seus subpacotes java.security.acl,
java.security.cert,java.security.interfaces e java.security.spec.
A máquina virtual Java opera com o carregamento dinâmico de classes, ou seja, bytecodes são
carregados pela máquina virtual Java à medida que são solicitados pela aplicação.
Em uma aplicação operando localmente, o carregador de classes da máquina virtual procura
por essas classes nos (sub-)diretórios especificados a partir da variável do sistema CLASSPATH. Se
c
�
2001 FEEC/UNICAMP 34
Programação orientada a objetos com Java 2.7. O ambiente de Java
encontrada, a classe é carregada para a máquina virtual e a operação continua. Caso contrário, a
exceção ClassNotFoundException é gerada.
O carregamento do código de uma classe para a JVM é realizado pelo class loader da máquina
virtual. O class loader, em si uma classe Java que provê essa funcionalidade, deve obedecer a uma
política de segurança estabelecida para aquela máquina virtual.
O estabelecimento de uma política de segurança deve obedecer a um modelo de segurança espe-
cífico. No modelo de segurança estabelecido a partir do JDK 1.2 (JDK security specification), todo
código sendo carregado para uma máquina virtual Java requer o estabelecimento de uma política de
segurança, visando evitar que algum objeto realize operações não-autorizadas na máquina local. Com
a inclusão do conceito de política de segurança, é possível estabelecer permissões diferenciadas para
as aplicações.
A política de segurança padrão é estabelecida em um arquivo do sistema, java.policy,
localizado no diretório <java_home>/lib/security/. Cada usuário pode estabelecer adi-
ções a essa política através da criação de um arquivo particular de estabelecimento de política,
.java.policy, em seu diretório home. Por exemplo, para permitir conexões soquete de qualquer
máquina com origem no domínio unicamp.br a portas não-notáveis, o arquivo .java.policy
deveria incluir
grant {
permission java.net.SocketPermission
"*.unicamp.br:1024-", "accept,connect";
};
A sintaxe para o arquivo de políticas (Policy files syntax) permite estabelecer domínios de per-
missão com base na origem do código ou na sua assinatura. A ferramenta policytool permite
criar um arquivo de políticas através de uma interface gráfica.
Para enforçar essas políticas alternativas de segurança, um SecurityManager deve ser cri-
ado. Applets, por default, utilizam um SecurityManager estabelecido pelo navegador em cujo
contexto estão executando. Outras aplicações devem criar explicitamente esse objeto. Por exemplo,
para criar um SecurityManager padrão para aplicações usando RMI (Seção 5.4.2), a seguinte
linha de código deveria ser incluída antes de executar qualquer operação envolvendo classes remotas:
System.setSecurityManager(new RMISecurityManager());
Se o cliente RMI estiver em um applet, então não é necessário criar um SecurityManager,
uma vez que o próprio navegador estabelece a política de segurança