Java. Disciplina: Programação Modular Prof. Marco Túlio de Oliveira Valente



Documentos relacionados
Chamadas Remotas de Procedimentos (RPC) O Conceito de Procedimentos. RPC: Programa Distribuído. RPC: Modelo de Execução

Invocação de Métodos Remotos

SISTEMAS DISTRIBUÍDOS

Java 2 Standard Edition. Fundamentos de. Objetos Remotos. Helder da Rocha

MIDDLEWARE Aplicativos RMI, RPC e eventos Camadas Protocolo Requesição-Respostal Middleware Representação Externa dos Dados Sistemas Operacionais

Análise de Programação

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Sistemas Paralelos e Distribuídos /2004 Curso: Matemática /Informática Sistemas Distribuídos /2004 Curso: Ensino da Informática

Invocação de Métodos Remotos RMI (Remote Method Invocation)

2 Orientação a objetos na prática

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

Java. Marcio de Carvalho Victorino

Java 2 Standard Edition Como criar classes e objetos

A ) O cliente terá que implementar uma interface remota. . Definir a interface remota com os métodos que poderão ser acedidos remotamente

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

Programação de Computadores - I. Profª Beatriz Profº Israel

Sistemas Distribuídos

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

Programação por Objectos. Java

Num sistema de objectos distribuídos, dois conceitos são fundamentais.

Programação por Objectos. Java

Algoritmos e Programação II. Sobrecarga

Sintaxe Geral Tipos de Dados. Prof. Angelo Augusto Frozza, M.Sc.

Análise e Projeto Orientados por Objetos

Especialização em desenvolvimento para web com interfaces ricas. Tratamento de exceções em Java Prof. Fabrízzio A. A. M. N. Soares

Comandos de repetição For (inicialização; condição de execução; incremento/decremento) { //Código }

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

insfcanceof new public switch transient while byte continue extends for int null

Orientação a Objetos em Java. Leonardo Gresta Paulino Murta leomurta@ic.uff.br

Java RMI. RMI Remote Method Invocation. Chamadas Remotas de Procedimentos (RPC) RPC - Implementação

POO Programação Orientada a Objetos. Classes em Java

Tutorial RMI (Remote Method Invocation) por Alabê Duarte

Sistemas Distribuídos

Programação Orientada a Objetos em Java

3 Classes e instanciação de objectos (em Java)

Computação II Orientação a Objetos

Desenvolvimento OO com Java Orientação a objetos básica

Programação por Objectos. Java

A Linguagem Java. Alberto Costa Neto DComp - UFS

Sobre o Professor Dr. Sylvio Barbon Junior

Construção de novas Classes em Java. Classes Atributos Métodos Herança...

Objetos Distribuídos - Programação Distribuída Orientado a Objetos. Luiz Affonso Guedes

Uma Introdução à Arquitetura CORBA. O Object Request Broker (ORB)

Orientação a Objetos e a Linguagem Java

Aula 09 Introdução à Java. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

Programação Orientada a Objetos e Java - Introdução. Carlos Lopes

Técnicas de Programação II

Módulo 06 Desenho de Classes

BSI UFRPE Prof. Gustavo Callou

Sistemas Distribuídos: Conceitos e Projeto Java RMI

Java RMI. Alcides Calsavara

Paradigmas da Programação PPROG. Linguagem JAVA. Interfaces. (Livro Big Java, Late Objects Capítulo 9) Nelson Freire (ISEP DEI-PPROG 2013/14) 1/33

7 RTTI e Interfaces. Desenvolvimento OO com Java. Vítor E. Silva Souza (vitorsouza@inf.ufes.br)

Java Básico. Classes Abstratas, Exceções e Interfaces Prof. Fernando Vanini Ic-Unicamp

Programação Orientada a Objetos C++

Computação II - Java Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Herança, Polimorfismo e Construtores

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Aplicações, durante a execução, podem incorrer em muitas espécies de erros de vários graus de severidade Quando métodos são invocados sobre um objeto:

Reuso com Herança a e Composiçã

Sistemas Distribuídos Métodos de Invocação Remota IV. Prof. MSc. Hugo Souza

Exercícios de Revisão Java Básico

Invocação de Métodos em Objectos Remotos

Slide 1 Deitel/Deitel, 8e. Java Como programar Copyright 2010 Pearson Education

Introdução à Programação. Interface, Polimorfismo e Dynamic Binding

Membros de classe e de instância. PARTE III: Java e OO - detalhes. Exemplo 1: método. Exercício. Exemplo 1 corrigido

Invocação Remota MC704

Sintaxe Básica de Java Parte 1

Encapsulamento de Dados

Implementando uma Classe e Criando Objetos a partir dela

APÊNDICE A EXEMPLO DE APLICAÇÃO

Programação Orientada a Objetos em Java. Herança

CONCEITOS DE LINGUAGEM DE PROGRAMAÇÃO CARACTERÍSTICAS. João Gabriel Ganem Barbosa

Exemplo 1. Um programa que cria uma instância de uma classe que herda da classe Frame

Sistemas Distribuídos Métodos de Invocação Remota II. Prof. MSc. Hugo Souza

Herança. Alberto Costa Neto DComp - UFS

1.6. Tratamento de Exceções

Curso de Java. Orientação a objetos e a Linguagem JAVA. TodososdireitosreservadosKlais

Unidade IV: Ponteiros, Referências e Arrays

Programação Orientada a Objetos (DPADF 0063)

Java Threads. Introdução

Herança. Algoritmos e Programação II. Aula 5 Herança

Tratamento de Exceções. Alberto Costa Neto DComp - UFS

PADI 2015/16. Aula 1 Introdução à Plataforma.NET

Programação Orientada a Objetos

Capítulo 4. Packages e interfaces

Laboratório de Computação VI JAVA IDL. Fabricio Aparecido Breve

Módulo 02 Programação Orientada a Objetos. Última atualização: 07/06/2010

Programação Orientada a Objetos (DPADF 0063)

Programação Estruturada. Programação Estruturada. Idéias Básicas da Programação Estruturada

Relevância e Motivação. Programação Orientada a Objetos Utilizando Java. Qualidade do Software. Objetivos. Cancelamentos.

Objetivos: Sun recomenda que utilize o nome de domínio da Internet da empresa, para garantir um nome de pacote único

Sistemas Distribuídos

Prof. Jhonatan Fernando

Aula 3 Objeto atual com referencia THIS e Classes com Herança

INTRODUÇÃO AO C++ SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

Transcrição:

Java Disciplina: Programação Modular Prof. Marco Túlio de Oliveira Valente

Introdução James Gosling e equipe (Sun, 1995) Linguagem compilada e posteriormente interpretada bytecode: linguagem intermediária Assembly de uma máquina hipotética Máquina Virtual Java: interpretador de bytecodes Não é novidade: Pascal-P (Wirth, década de 70) Mesma estratégia em C#: CLR e CIL (ou MSIL) Vantagem: portabilidade prog1.java (fonte) COMPILADOR prog1.class (bytecodes) MÁQUINA VIRTUAL JAVA - JVM (INTERPRETADOR) 2

Princípios de Projetos Linguagem que fosse: Simples, orientada a objetos, familiar Robusta e segura Arquiteturalmente neutra e portável Alto desempenho Interpretada, multi-thread e dinâmica 3

Java é mais simples que C++ Sem ponteiros, apenas referências Sem funções, apenas métodos estáticos Sem variáveis globais, apenas atributos estáticos Sem delete, mas com coletor de lixo Sem arquivos de header, mas interfaces Sem sobrecarga de operadores, apenas de métodos Sem pré-processador, mas com membros final Sem herança múltipla de classes, mas com herança múltipla de interfaces 4

Java é mas segura que C++ Não é possíveis acessar quaisquer áreas de memória: Não existe aritmética de ponteiros. Exemplo: p++ Não existem casts não-verificados. Exemplo: (char *) 2 Não existem acessos além dos limites de um vetor. Exemplo: buffer[-1] 5

Java é mais portátil que C++ Independência de hardware e sistema operacional. Mesmo programa roda em uma grande variedade de hardware e sistemas operacionais. Programas.java são compilados para uma representação intermediária, chamada bytecode (.class) Máquina Virtual Java (JVM): interpretador de bytecodes 6

Java tem mais bibliotecas que C++ Vasta gama de bibliotecas para: construção de interfaces gráficas (java.awt e javax.swing) programação distribuída (java.rmi) programação multithread (java.lang.threads) entrada/saída e redes: (java.io, java.net) estruturas de dados (java.util) bancos de dados (java.sql) etc 7

Primeiro Programa // arquivo HelloWorld.java public class HelloWorld { public static void main(string[ ] args){ System.out.println ( Hello, world ); Todo arquivo deve ter uma classe pública com o mesmo nome do arquivo Execução começa pelo método main desta classe Observações: Programa em Java é um conjunto de classes Implementação dos métodos sempre dentro da classe 8

Sintaxe e Tipos Primitivos Sintaxe bastante parecida com C/C++. Mesmos comandos básicos: if, switch, while, do while, for, return, break, continue Mesmos operadores aritméticos, lógicos e relacionais Tipos primitivos: boolean (8 bits) char (16 bits) byte (8 bits), short (16 bits), int (32 bits), long (64 bits) float (32 bits), double (64 bits) 9

Classes class Point { private double x, y; // campos public Point (double x, double y) { this.x= x; this. y= y; public double getx() { return x; public double gety() { return y; public void move(double dx, double dy) { x=+ dx; y=+ dy; // construtora // métodos 10

Classes (cont.) public double distance(point that) { double xdiff= this.x - that.getx(); double ydiff= this.y - that.gety(); return Math.sqrt(xdiff*xdiff + ydiff*ydiff); public void clear() { x= 0; y= 0; 11

Objetos Sempre criados via new e alocados no heap. Exemplo: void foo() { Point p1; // p1 e p2 são referências para objetos Point p2; p1= new Point(5,5); p2= new Point(1000,500); double dist= p1.distance(p2); // chamada de método p1 e p2 são duas variáveis alocadas no stack que referenciam (ou apontam para objetos alocados no heap). Em Java, objetos nunca são alocados no stack. 12

Programa Equivalente em C++ void foo() { Point *p1; Point *p2; p1= new Point(5,5); p2= new Point(1000,500); double dist= p1->distance(p2); // chamada de método delete p1; delete p2; 13

Coletor de Lixo Não existe free ou delete Programador aloca, mas não precisa liberar memória Tarefa normalmente sujeita a diversos erros Funcionamento: Existe na JVM um processo, chamado coletor de lixo, que fica continuamente procurando por objetos que não estão sendo mais referenciados Quando encontra um objeto inacessível, o coletor de lixo libera a área de memória alocada para o mesmo Não se tem controle sobre o momento em que o coletor de lixo roda Não é uma novidade em LP: LISP, 1960 14

Exemplo de Coleta de Lixo class BigClasse { private int x; private int bigvetor []; // vetor de inteiros public BigClasse (int x) { System.out.println ("Criando " + x1); this.x= x1; bigvetor= new int [1024*1024]; protected void finalize () { System.out.println("Eliminando " + x); // BigClasse 15

Exemplo de Coleta de Lixo public class Exemplo2 { public static void main(string[] args) { BigClasse p; for (int i= 0; i < 100; i++) p= new BigClasse (i); Método finalize(): chamado automaticamente pelo coletor antes de liberar a área de memória de um objeto Utilidade: liberar outros recursos (que não memória) Exemplo: fechar arquivos, fechar conexões etc 16

Semântica de Valor e de Referência C++: objetos tratados com semântica de valor ou referência (programador que decide) void foo() { Point *p1; // semântica de referência Point p2; // semântica de valor... Java: objetos tratados exclusivamente com semântica de referência void foo() { Point p1; // semântica de referência... p1= new Point(10,10); 17

Referência this Referência para o objeto receptor de uma chamada de método class Point { private double x, y; public Point (double x, double y) { this.x= x; this. y= y;... 18

Membros Estáticos Campos estáticos: semântica de variável global; são campos da classe e não de uma instância em particular. Existem mesmo que não existam objetos da classe Point. class Point { private static Point origin= new Point(0,0);... Métodos estáticos: semântica de funções de C ou C++ São métodos da classe Não dependem de uma instância para serem chamados. Exemplo: Math.sqrt Podem acessar apenas atributos e métodos estáticos Não podem acessar a referência this 19

Campos Final Campos read-only. Uma vez inicializados, nunca mais podem ser alterados. Normalmente, são também estáticos. Exemplo: public static final double PI = 3.14; 20

Vetores Vetores são tratados com objetos e, portanto, são criados via operador new (e alocados no heap). class Gauss { public static void main(string[] args) { int[] ia = new int[101]; // índices vão de 0 a 100 for (int i = 0; i < ia.length; i++) ia[i] = i; int sum = 0; for (int i = 0; i < ia.length; i++) sum += ia[i]; System.out.println(sum); Tamanho do vetor é definido em tempo de criação; uma vez criado, não pode ser modificado Tentativa de usar um vetor além dos limites permitidos gera uma exceção do tipo ArrayIndexOutOfBoundsException 21

Vetores de Vetores Exemplo: float[][] mat= new float[4][4]; setupmatrix(mat); for (int y= 0; y < mat.length; y++) { for (int x= 0; x < mat[y].length; x++) System.out.print(mat[y][x] + " "); System.out.println(); 22

Strings Strings são objetos da classe String. Exemplo: String greeting = "Hello world!"; Classe String possui diversos métodos para manipular strings. Exemplos: charat, concat, endswith, length, tolowercase etc Objetos da classe String são imutáveis. Operações sobre strings sempre retornam uma nova string. String original permanece inalterada. 23

Herança Possui apenas herança simples de classes Exemplo: class Pixel extends Point { Color color; // novo atributo public void clear() { // redefine (ou sobresceve) método herdado super.clear(); color= null; // chama método da superclasse Polimorfismo: objetos Pixel podem ser usados por qualquer código que espere um Point 24

Chamada Dinâmica de Métodos Não existem métodos virtuais; maioria dos métodos são automaticamente considerados virtuais (isto é, chamados dinamicamente) Exceções: métodos privados e estáticos Exemplo: Figura p; // Quadrado e Circulo subclasses de Figura if (... ) p= new Quadrado (4); // atribuição polimórfica else p= new Circulo (3); // atribuição polimórfica double a= p.area (); // chamada dinâmica 25

Classe Object Raiz da hierarquia de classes de Java Toda classe (direta ou indiretamente) é subclasse de Object Utilidade: variável do tipo Object pode se referir a qualquer objeto (de qualquer classe) Exemplo 1: void push(object item) {... Exemplo 2: Object oref= new Pixel();... oref = "Alguma String" 26

Classe Object Exemplo 3: String name= "Petronius" Object obj= name; name= obj; // Erro de compilação name= (String) obj; // ok Se coerção falhar em tempo de execução, lança-se uma exceção ClassCastException. 27

Classes e Métodos final Evitando herança: final class Senha {... class MinhaSenha extends Senha {... // Erro! Evitando redefinição de métodos: class Senha {... public final bool validarsenha () {...... class MinhaSenha extends Senha {... bool validarsenha () {... // Erro!... 28

Classes Abstratas Exemplo: abstract class Figura { public abstract double area (); public abstract double perimetro ();... void foo() { Figura f1; // ok, f1 é apenas uma referência Figura f2= new Figura() // Erro, não é possível instanciar // objetos de classes abstratas Implementação de area() e perimetro() ficará a cargo das subclasses de Figura. 29

Interfaces Usadas para enriquecer o modelo de herança simples de Java Permitem alguns benefícios de herança múltipla, sem os problemas que herança múltipla introduz no projeto e implementação de linguagens Interface define um tipo composto apenas por: Assinaturas de métodos Constantes Uma interface não inclui variáveis de instância, nem código para implementação de métodos. Uma classe pode declarar que implementa (implements) uma interface. Neste caso, ela assume o compromisso de implementar todos os métodos desta interface 30

Interfaces Exemplo (declaração da interface): interface Comparable { int compareto(object o); Exemplo (implementação da interface): class Professor extends Pessoa implements Comparable { int matr;... int compareto(object o) { Professor that= (Professor) o; Compara this.matr e that.matr, retornando -1, 0 ou 1 31

Interfaces Exemplo (uso da interface): void qsort (Comparable[] v) {... Não importa a classe dos objetos do vetor v (ou seja, essas classes ficam livres para herdarem de outras classes) 32

Interfaces Interface define um contrato (ou protocolo) entre: Um provedor de serviços (ex: quem implementa compareto) Um usuário de serviços (ex: método de ordenação) Uma classe pode herdar de uma única classe, mas pode implementar múltiplas interfaces. Logo, objetos em Java podem ter múltiplos tipos, incluindo o tipo de sua classe e os tipos das interfaces que ela implementa. Uma interface pode estender uma ou mais interfaces (adicionando novas constantes ou novos métodos). Ou seja, existe herança múltipla de interfaces (a qual não implica em nenhuma forma de reúso de código) 33

Classes Genéricas Exemplo: public class Box<T> { private T t; public void add(t t) { this.t = t; public T get() { return t; // T stands for "Type"... Box<Integer> integerbox = new Box<Integer>(); integerbox.add(new Integer(10)); Integer someinteger = integerbox.get(); // no cast! 34

Interfaces Genéricas Exemplo de interface genérica: interface Table<T> { T find(string name); É melhor que: interface Table { Object find(string name); 35

Interfaces Genéricas Implementação da interface class IntegerTable implements Table<Integer> { private String[] names; private Integer[] values; public Integer find(string name) {... 36

Interfaces Genéricas Código que usa interface genérica (1ª tentativa) void processvalues(string[] names, Table<Object> table { for (int i= 0; i < names.length; i++) { Object value= table.find(names[i]); if (value!= null) process(names[i], value); Problema: Table<Integer> t= new IntegerTable(); //... adiciona itens em t String[] names= { "Um", "Dois" ; processvalues(names, t); // Erro! 37

Interfaces Genéricas Integer é subtipo de Object. Mas, Table<Integer> não é um subtipo de Table<Object> Exemplo: List<String> ls= new ArrayList<String>(); List<Object> lo= ls; Atribuição acima é válida? Não, conforme justificado a seguir. lo.add(new Object()); // via lo, seria possível adicionar objetos de quaisquer tipos em ls String s= ls.get(0); // não se garante mais que get retorne sempre um string 38

Tipos Genéricos e Wildcards List <?>: super-tipo de todas as listas E não List<Object> pelas razões descritas no slide anterior Exemplo: List<String> ls= new ArrayList<String>(); List<Object> lo= ls; // Erro compilação List<?> lu= ls; // ok lu.add(new Object()); // Erro compilação Object o= lu.get(0);?: stands for some unknown type Any parameter we pass to add would have to be a subtype of this unknown type. Since we don't know what type that is, we cannot pass anything in. 39

Tipos Genéricos e Wildcards 1a Solução: usando um tipo coringa ilimitado (?) void processvalues(string [] names, Table<?> table { for (int i= 0; i < names.length; i++) { Object value= table.find(names[i]); // OK if (value!= null) process(names[i], value); Table<Integer> t= new IntegerTable(); //... adiciona itens em t String [] names= { "Um", "Dois" ; processvalues(names, t); // ok 40

Tipos Genéricos e Wildcards 2a Solução (melhor): usando um tipo coringa limitado void processvalues(string[] names, Table<? extends Number> table { for (int i= 0; i < names.length; i++) { Number value= table.find(names[i]); if (value!= null) process(names[i], value); 41

Packages Recurso para modularização de programas em Java Package: conjunto de arquivos Cada arquivo pode possuir, no máximo, uma classe pública O nome do arquivo é o mesmo de sua classe pública Todo pacote possui um nome Exemplo: pacote figuras Com classes públicas Figura, Circulo, Quadrado Arquivo c:\temp\figuras\figura.java: package figuras; public abstract class Figura {... // outras classes (não-públicas) 42

Packages Arquivo c:\temp\figuras\circulo.java package figuras; public class Circulo {... // outras classes (não-públicas) Arquivo c:\temp\figuras\quadrado.java package figuras; public class Quadrado {... // outras classes (não-públicas) 43

Packages Nome do pacote deve ser igual ao nome do diretório que contém seus arquivos Variável de ambiente CLASSPATH: deve conter o nome do diretório onde se encontra o diretório do pacote Exemplo: set CLASSPATH=%CLASSPATH%;c:\temp 44

Packages Como referenciar classes públicas de um pacote fora do mesmo? Via qualificação com o nome do pacote: figuras.figura fig; figuras.circulo c; java.awt.button btnok; Via comando import no início do arquivo: import figuras.*; // importa todas classes de figuras import java.awt.button; // importa apenas classe Button... Figura fig; Circulo c; Button btnok; 45

Tratamento de Exceções em Java Como ativar uma exceção: throw <expressão> Expressão deve ser um objeto de uma classe derivada da classe pré-definida Exception Similar a C++, porém incluir um new para criar objeto Métodos devem relacionar na clásula throws todas as exceções que podem encerrar a execução do mesmo Exemplo: class DivisaoPorZero extends Exception { ;... double divisao (double x, double y) throws DivisaoPorZero { if (y = = 0) throw new DivisaoPorZero (); return x / y; 46

Tratamento de Exceções em Java Como especificar um tratador de exceções? try {... catch (ExceptionType ident ) {... catch (ExceptionType ident) {... finally {... finally é executado ocorrendo ou não uma exceção no try Exemplo: try {... catch (A e) {... finally {... finally será executado quando: (a) try terminar corretamente; (b) try terminar com uma exceção capturada ou não pelo catch 47

Tratamento de Exceções em Java Exemplo sem finally: file.open(); try {... // processa arquivo catch (IOException e) { file.close(); throw e; file.close(); Exemplo com finally: file.open(); try {.. finally { file.close(); 48

Exceções Não-Verificadas Exceções Verificadas: Subclasses de Exception Exemplos: IOException, FileNotFoundException Devem ser tratadas no corpo de um método (em um catch) ou explicitamente declaradas na assinatura do método Em resumo, um método somente pode retornar com exceções verificadas que ele lista em sua cláusula throws Exceções não-verificadas: Subclasses de RuntimeException ou Error Normalmente, exceções que representam algum erro na lógica do programa; clientes normalmente não tem o que fazer nestes casos Exemplos: ArrayIndexOutOfBoundsException, NullPointerException 49

Java RMI Disciplina: Programação Modular Prof. Marco Túlio de Oliveira Valente

Java RMI Middleware para programação distribuída em Java Implementado como um pacote da linguagem 51

Java RMI: Exemplo de Aplicação Codificar um servidor com um objeto da seguinte classe: class ContaImpl... {... public float obtersaldo ();... Codificar um cliente que chame remotamente o método obtersaldo() deste objeto 52

Java RMI: Exemplo de Aplicação Passo 1: Definição da interface remota (assinatura dos métodos que serão invocados remotamente) // arquivo Conta.java import java.rmi.remote; import java.rmi.remoteexception; interface Conta extends Remote {... public float obtersaldo () throws RemoteException;... 53

Java RMI: Exemplo de Aplicação Passo 2: Implementação da Interface Remota (servidor) class ContaImpl extends UnicastRemoteObject implements Conta { private int numero; private float saldo= 0.0; public ContaImpl (int n) throws RemoteException { numero= n; public float obtersaldo () throws RemoteException { return saldo; public static void main (String[] args) {... Conta c= new ContaImpl (804); Naming.rebind ( Conta804, c); // registra este objeto 54

Java RMI: Exemplo de Aplicação Passo 3: Implementação do Cliente import java.rmi.*; import java.rmi.server.*; public class ClienteImpl { public static void main (String[] args) {... Conta c= (Conta) Naming.lookup ( // + args[0] + /Conta804 ); float s= c.obtersaldo(); // chamada remota, mesma sintaxe chamada local... 55

Java RMI: Exemplo de Aplicação Passo 4: Compilação Compilação do servidor: javac ContaImpl.java Compilação do cliente: javac ClienteImpl.java Geração de stubs: rmic ContaImpl rmic gera os seguintes arquivos: ComtaImpl_Stub.class: stub do cliente ContaImpl_Skel.class: skeleton (nome dado ao stub do serv.) Passo 5: Execução Execução do Servidor: rmiregistry // registry (permanece em execução) java ContaImpl // servidor (em outro processo) Execução do Cliente: java clienteimpl dcc_srv01 56

Passagem de Parâmetros Objetos serializáveis são passador por valor: Classe do objeto deve implementar a interface Serializable Passa-se uma cópia do objeto (atributos + métodos) Objetos remotos são passadas por referência: Passa-se a referência (e não o objeto), a qual pode ser utilizada para realizar um callback no cliente Callback: servidor chama método do cliente Usado, por exemplo, quando o servidor deseja notificar o cliente sobre a ocorrência de algum evento 57

Exemplo de Callback Cliente Servidor objeto remoto objeto remoto void g () {... A B void f (A a) { a.g(); // callback a s s.f(a); 58

Java RMI - Chat Aplicação de chat usando Java RMI, com a seguinte interface: 59

Sistema de Chat em Java RMI conectados remoto void conecta(c c) { adiciona c em conectados void envia (String s) { for (int i= 0; i < conectados.size; i++) conectados[i].display(s); // callback remoto remoto remoto display (s) display (s) display (s) c s.conecta(c);... s.envia( Bom dia! ); c s.conecta(c); c s.conecta(c); 60

Reflexão Computacional Disciplina: Programação Modular Prof. Marco Túlio de Oliveira Valente

Reflexão Computacional Capacidade de um sistema se auto-inspecionar e auto-manipular Um sistema reflexivo possui dois níveis: Nível básico: contém objetos do domínio da aplicação Meta-nível: contém objetos que permitem acessar propriedades e manipular objetos do nível básico Objeto do meta-nível são chamados de meta-objetos Protocolo de meta-objetos: protocolo de interação com metaobjetos Reificação: ação de transformar em meta-objetos informações do nível base Reflexão envolve duas atividades: Inspeção: quando meta-nível inspeciona informações do nível básico Interseção: quando meta-nível interfere no comportamento ou na estrutura do nível básico 62

Reflexão em Java Tudo começa com um meta-objeto do tipo Class Exemplo: Class c= Class.forName( java.util.stack ); Pode-se usar métodos do tipo Class para inspeção de informações: Obter a super-classe do tipo base Obter interfaces que são implementadas pelo tipo base Obter informações sobre os construtores do tipo base Obter informações sobre os métodos do tipo base (modificadores, tipo de retorno, tipo dos parâmetros) Pode-se ainda interceder no nível básico do programa para: Criar objetos de tipos cujos nomes somente serão conhecidos em tempo de execução Obter/definir valores de atributos cujos nomes somente serão conhecidos em tempo de execução Invocar métodos cujos nomes somente serão conhecidos em tempo de execução 63

Reflexão em Java Programa que lista informações sobre uma interface cujo nome é informado pelo usuário: Console.readString(s); // le nome da interface do teclado Class c= Class.forName(s); Method[] themethods= c.getmethods(); for (int i = 0; i < themethods.length; i++) { String methodstring= themethods[i].getname(); System.out.println("Name: " + methodstring); String returnstring= themethods[i].getreturntype().getname(); System.out.println(" Return Type: " + returnstring); Class[] parametertypes= themethods[i].getparametertypes(); System.out.print(" Parameter Types:"); for (int k= 0; k < parametertypes.length; k ++) { String parameterstring= parametertypes[k].getname(); System.out.print(" " + parameterstring); System.out.println(); 64

Classes Proxy Dinâmicas Recurso de reflexão de Java para criação dinâmica de proxies Proxy: padrão de projeto comum em aplicações distribuídas Proxy: objeto que implementa a mesma interface de um objeto base Age como um intermediário entre objeto base e seus clientes Normalmente, possuem uma referência para objeto base e interceptam todas as chamadas destinadas ao mesmo Exemplo: stubs são exemplos de proxy Em Java, classes proxy dinâmicas têm duas propriedades: Seu código é criado em tempo de execução Implementam interfaces definidas em tempo de criação Instâncias de classes proxy dinâmicas têm ainda um objeto manipulador de invocação (invocation handler), o qual é definido pelo cliente que solicitou a criação das mesmas. 65

Classes Proxy Dinâmicas Toda a invocação de método sobre uma instância de uma classe proxy dinâmica é enviada automaticamente para o método invoke do manipulador desta instância, passando os seguintes parâmetros: a instância da classe proxy sobre a qual a invocação foi realizada; um objeto da classe java.lang.reflect.method, o qual reifica o método que está sendo chamado; um vetor do tipo Object que contém os argumentos deste método. 66

Classes Proxy Dinâmicas <<interface>> Service service implements Client references DynamicProxyClass service ServiceImpl service references <<interface>> InvocationHandler implements InvocationHandlerIm pl references invoke(object, Method, Object[]) invoke(object, Method, Object[]) 67

Exemplo de Classe Proxy class DebugHandler implements java.lang.reflect.invocationhandler { private Object base; private DebugHandler(Object base) { this.base = base; public Object invoke(object proxy, Method m, Object[] args) throws Throwable { Object result; try { System.out.println("before method " + m.getname()); result = m.invoke(base, args); // forward to base object catch (...) {... finally { System.out.println("after method " + m.getname()); return result; // class DebugHandler 68

Exemplo de Classe Proxy Exemplo de Uso: interface Foo { Object bar(object obj); class FooImpl implements Foo { Object bar(object obj) {...... Foo base= new FooImpl(); DebugHandler handler= new DebugHandler(base); Class c= base.getclass(); Foo proxy= Proxy.newProxyInstance(c.getClassLoader(), c.getinterfaces(), handler);... proxy.bar(...); 69