programação orientada a objetos · reflexão)é)a)capacidade)de)um)programa)examinar)...

33
BCC221 Programação Orientada a Objetos Prof. Marco Antonio M. Carvalho 2013/1

Upload: others

Post on 17-Oct-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

BCC221 Programação Orientada a Objetos Prof. Marco Antonio M. Carvalho 2013/1

Page 2: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!!

Avisos!2

Page 3: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

3

Page 4: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!  Arquivos)

4

Page 5: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!  Introdução)ao)Java)Reflection)

5

Page 6: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!  Reflexão)é)a)capacidade)de)um)programa)examinar)(ou)“introspectar”),)manipular)e)até)mesmo)modificar)sua)própria)estrutura)!  Em)tempo)de)execução.)

!  Em)certas)situações,)a)necessidade)produção)de)código)pode)explodir)!  O)código)precisa)reagir)a)vários)cenários)diferentes)▪  Reagir)corretamente)a)diferentes)contextos.)

!  Plugabilidade.)

6

Page 7: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!  Normalmente,)para)garantir)a)plugabilidade)de)um)componente)de)software,)implementamos)interfaces)específicas)e)preparamos)um)mecanismo)de)acoplamento)!  No)entanto,)isto)pode)não)ser)suficiente)para)garantir)a)plugabilidade.)

7

Page 8: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!  Um)sistema)pode)adaptarMse)dinamicamente)a)diferentes)situações)!  Por)exemplo,)uma)classe)X)precisa)se)comunicar)com)um)

determinado)serviço;)!  Agora,)a)mesma)classe)precisa)se)comunicar)com)o)mesmo)

serviço)utilizando)a)classe)Y!▪  Métodos)com)nomes)diferentes,)por)exemplo.)

!  Normalmente,)teríamos)que)modificar)nosso)código)manualmente)e)recompiláMlo)!  Usando)reflexão)isto)pode)ser)evitado;)!  A)aplicação)descobre)quais)são)os)métodos)da)classe)Y)e)os)

invoca)dinamicamente;)!  Com)reflexão,)nem)sequer)o)nome)da)nova)classe)precisaria)ser)

incluso)diretamente)no)código.)

8

Page 9: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!  Da)documentação)oficial:)!  “A)reflexão)é)um)recurso)relativamente)avançado)e)deve)ser)utilizado)apenas)por)desenvolvedores)que)possuem)um)forte)embasamento)dos)fundamentos)da)linguagem.)Com)esta)advertência)em)mente,)a)reflexão)é)uma)técnica)poderosa)e)pode)permitir)que)os)aplicativos)executem)operações)que)de)outra)forma)seriam)impossíveis.)”)

9

Page 10: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!  Extensibilidade!!  Uma)aplicação)pode)fazer)uso))de)classes)de)terceiros,)externas,)

através)da)criação)de)instâncias)de)objetos)de)extensibilidade)através)de)seus)nomes.)

!  Browsers!de!Classes!e!AutoComplete.!  Um)browser)de)classes)precisa)listar)todos)os)membros)de)uma)

classe;)!  Ferramentas)de)autocomplete)se)valem)das)informações)de)tipo)

para)auxiliar)na)escrita)de)códigos.)!  Depuradores!e!Ferramentas!de!Teste!

!  Depuradores)precisam)ter)a)habilidade)de)examinar)os)membros)privados)de)classes;)

!  Ferramentas)de)teste)podem)fazer)o)uso)de)reflexão)para)sistematicamente)invocar)um)conjunto)de)APIs)definidas)em)uma)classe,)de)forma)a)garantir)maior)cobertura)de)um)código)em)teste.))

10

Page 11: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!  Overhead!de!Performance!!  A)reflexão)envolve)resolução)dinâmica)e)por)isto,)otimizações)da)JVM)

não)podem)ser)realizadas;)!  Consequentemente,)a)performance)de)operações)que)usam)reflexão)é)

mais)lenta)e)deve)ser)evitada)quando)o)desempenho)é)importante.)!  Restrições!de!Segurança!

!  A)reflexão)requer)permissões)em)tempo)de)execução)que)podem)não)estar)presentes)quando)a)execução)se)dá)sob)um)gerente)de)segurança;)

!  Esta)é)uma)consideração)importante)para)códigos)que)rodam)em)contextos)restritos)de)segurança,)como)applets.)

!  Exposição!de!Detalhes!Internos!!  A)reflexão)permite)a)escrita)de)códigos)que)seriam)ilegais)em)outros)

contextos,)como)por)exemplo)a)listagem)de)membros)privados;)!  O)uso)desta)técnica)pode)destruir)a)portabilidade,))tornar)o)código)

disfuncional)e)quebrar)a)abstração.)

11

Page 12: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!  Presente)no)Java)desde)a)versão)1.1,)o)recurso)de)reflexão)também)é)encontrada)em)outras)linguagens:)!  PHP;)!  Python;)!  Ruby;)!  ObjectiveMC;)

!  ECMAScript.)

!  A)reflexão)é)também)a)chave)para)a)metaprogramação!!  A)criação)de)programas)que)escrevem)ou)manipulam)outros)

programas)(ou)a)si)próprios))como)se)fossem)os)próprios)dados.)

12

Page 13: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!  O)exemplo)abaixo)ilustra)a)criação)de)uma)instância)da)classe)Foo)e)a)invocação)do)método)hello.)

//Sem reflection!new Foo().hello(); !!//Com reflection!Class<?> clazz = Class.forName("Foo"); !clazz.getMethod("hello").invoke(clazz.newInstance());)

13

Page 14: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!  O)quê)pode)ser)feito)pelo)Reflection)API?)!  Obter)a)listagem)de)todos)os)métodos)de)uma)classe)(definidos)ou)herdados))▪  Tipo,)modificador)de)acesso,)parâmetros)(nomes)e)tipos),)etc.)

!  Obter)informações)sobre)construtores;)!  Obter)informações)sobre)atributos)de)uma)classe;)!  Invocar)métodos)conhecidos)apenas)em)tempo)de)execução)▪  Tratando)o)retorno)e)passando)os)argumentos)adequados.)

!  Criar)objetos)de)classe)conhecidas)apenas)em)tempo)de)execução;)

!  Alterar)atributos)destes)mesmos)objetos.)

14

Page 15: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!  As)classes)do)Reflection)estão)armazenadas)no)pacote)java.lang.reflect;)

!  Para)utilizar)estas)classes)é)necessário:)!  Obter)um)objeto)da)classe)java.lang.Class;)!  Utilizada)para)representar)classes)e)interfaces)em)execução.))

Class c = Class.forName("java.lang.String");

Class c = int.class; Class c = Integer.TYPE;

)

!  Invocar)um)método)getter)adequado;)!  Por)exemplo,)getMethodDeclarations().)

!  A)partir)daí,)basta)usar)a)API)Reflection)para)manipular)as)informações.)

15

Page 16: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

16

Classe! Descrição!

java.lang.reflect.Constructor)Fornece)informações)sobre)os)construtores)da)classe.)

java.lang.reflect.Field) Fornece)informações)sobre)os)atributos)da)classe.)

java.lang.reflect.Method) Fornece)informações)sobre)os)métodos)da)classe.)

java.lang.reflect.Modifier)Fornece)informações)sobre)os)modificadores)de)acesso)da)classe.)

Page 17: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

17

Page 18: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

import java.lang.reflect.*; !!public class ReflectionTeste { ! !

"public static void main(String args[]) { !" try { !" "Class c = Class.forName( "java.lang.String" ); !" "Method m[] = c.getDeclaredMethods(); !" "for (int i = 0; i < m.length; i++) { !

" "System.out.println( m[i].toString() ); ! "} ! " } !

" catch (Throwable e) { !" " "System.err.println(e); !" } !

} !}!

18

Page 19: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

Class cls = Class.forName("java.lang.String"); !!boolean b1 = cls.isInstance(new Integer(37)); !System.out.println(b1); !!boolean b2 = cls.isInstance(new java.lang.String("teste")); !System.out.println(b2);)

19

Page 20: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

import java.lang.reflect.*; !!public class Classe1 { ! !

"private int funcao1( Object p, int x ) throws NullPointerException {!" "if (p == null) !" " "throw new NullPointerException(); !

return x; !} !!public static void main(String args[]) { ! try { ! Class cls = Class.forName("Classe1"); ! Method methlist[] = cls.getDeclaredMethods(); ! ! for (int i = 0; i < methlist.length; i++) { !

"Method m = methlist[i]; !"System.out.println("nome = " + m.getName()); !"System.out.println("membro da classe = “+m.getDeclaringClass()); !"System.out.println("modificador = “+Modifier.toString(m.getModifiers())); !"Class pvec[] = m.getParameterTypes();)

20

Page 21: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

for (int j = 0; j < pvec.length; j++) ! System.out.println("parâmetro #"+j+" "+pvec[j]); ! ! Class evec[] = m.getExceptionTypes(); ! for (int j = 0; j < evec.length; j++) !

" System.out.println("exceção #" + j + " " + evec[j]); !" System.out.println("tipo de retorno = “+m.getReturnType()); !" System.out.println("-----"); !

} ! } ! catch (Throwable e) { !

"System.err.println(e); ! } ! } !})

21

Page 22: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

import java.lang.reflect.*; !public class Constructor1 { ! ! public Constructor1() { } ! ! protected Constructor1(int i, double d) { } ! ! public static void main(String args[]) { ! try { !

"Class cls = Class.forName("constructor1"); !"Constructor ctorlist[] = cls.getDeclaredConstructors(); !

!"for (int i = 0; i < ctorlist.length; i++) { !" Constructor ct = ctorlist[i]; !" System.out.println("nome = " + ct.getName()); !" System.out.println("membro da classe = " + ct.getDeclaringClass()); !

!" Class pvec[] = ct.getParameterTypes(); !" for (int j = 0; j < pvec.length; j++) !" System.out.println("parâmetro #" + j + " " + pvec[j]); !

!" Class evec[] = ct.getExceptionTypes(); !" for (int j = 0; j < evec.length; j++) !" System.out.println("exceção #" + j + " " + evec[j]); !"} !

} ! catch (Throwable e) { !

"System.err.println(e); ! } ! } !}) 22

Page 23: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

import java.lang.reflect.*; !!public class TesteAtributos { ! ! private double d; ! public static final int i = 37; ! String s = "testing"; ! ! public static void main(String args[]) { ! try { !

"Class cls = Class.forName("TesteAtributos"); ! !

"Field fieldlist[] = cls.getDeclaredFields(); !"for (int i = 0; i < fieldlist.length; i++) { !" Field fld = fieldlist[i]; !" System.out.println("nome atributo = " + fld.getName()); !

System.out.println("membro da classe = " + fld.getDeclaringClass()); !" System.out.println("tipo = " + fld.getType()); !" int mod = fld.getModifiers(); !" System.out.println("modificadores = " + Modifier.toString(mod)); !"} !

} ! catch (Throwable e) { !

"System.err.println(e); ! } ! } !})

23

Page 24: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

import java.lang.reflect.*; !public class InvocaMetodo { ! ! public int umMetodo(int a, int b) { !

"return a + b; ! } ! !public static void main(String args[]) { ! try { !

"Class partypes[] = new Class[2]; !"partypes[0] = Integer.TYPE; !"partypes[1] = Integer.TYPE; !

!"Class cls = Class.forName("InvocaMetodo"); !"Method meth = cls.getMethod("umMetodo", partypes); !

!"Object arglist[] = new Object[2]; !"arglist[0] = new Integer(37); !"arglist[1] = new Integer(47); !

!"InvocaMetodo methobj = new InvocaMetodo(); !"Object retobj = meth.invoke(methobj, arglist); !"Integer retval = (Integer)retobj; !"System.out.println(retval.intValue()); !

} ! catch (Throwable e) { !

"System.err.println(e); ! } ! } !})

24

Page 25: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

import java.lang.reflect.*; !public class TesteConstrutor { ! ! public TesteConstrutor() { } ! ! public TesteConstrutor(int a, int b) { !

"System.out.println("a = " + a + " b = " + b); ! } ! ! public static void main(String args[]) { ! try { !

"Class cls = Class.forName("TesteConstrutor"); ! !

"Class partypes[] = new Class[2]; !"partypes[0] = Integer.TYPE; !"partypes[1] = Integer.TYPE; !

!"Constructor ct = cls.getConstructor(partypes); !

!"Object arglist[] = new Object[2]; !"arglist[0] = new Integer(37); !"arglist[1] = new Integer(47); !

!"Object retobj = ct.newInstance(arglist); !

} ! catch (Throwable e) { !

"System.err.println(e); ! } ! } !})

25

Page 26: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

import java.lang.reflect.*; !!public class AlteraValorCampo { ! !

"public double d; ! !

"public static void main(String args[]) { !" "try { !" " "Class cls = Class.forName("AlteraValorCampo"); !" " "Field fld = cls.getField("d"); !" " "AlteraValorCampo f2obj = new AlteraValorCampo();!" " "System.out.println("d = " + f2obj.d); !" " "fld.setDouble(f2obj, 12.34); !" " "System.out.println("d = " + f2obj.d); !" "} !" "catch (Throwable e) { !" " "System.err.println(e); !" "} !"} !

})

26

Page 27: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

Class cls = Class.forName("java.lang.String"); !Object arr = Array.newInstance(cls, 10); !Array.set(arr, 5, "Isto é um teste"); !String s = (String)Array.get(arr, 5); !System.out.println(s);)

27

Page 28: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!  Vantagens!!  Padronização;)!  Ganho)de)produtividade;)!  Minimização)de)erros;)

!  Facilidade)de)Manutenção.)

!  Desvantagens!!  Redução)de)desempenho;)

!  Problemas)por)restrição)de)segurança;)

!  Exposição)da)estrutura)interna)dos)objetos.)

28

Page 29: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!  A)API)Reflection)é)especialmente)útil)porque)permite)a)obtenção)de)informações)sobre)classes)a)partir)do)próprio)nome)!  Permite)ainda)a)manipulação)destas)informações)em)tempo)de)

execução.)

!  Esta)característica)da)linguagem)Java)é)extremamente)poderosa)!  Não)há)equivalente)em)outras)linguagens,)como)C)ou)C++.)

!  Mais)sobre)o)assunto)em)http://download.oracle.com/javase/tutorial/reflect/)

29

Page 30: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!  Os)exemplos)desta)aula)foram)retirados)do)site)GUJ.com.br. ))

!  Disponível)em))http://www.guj.com.br/articles/10)

30

Page 31: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

31

Perguntas?!

Page 32: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!  Prova)!  Demonstração)do)TP)

32

Page 33: Programação Orientada a Objetos · Reflexão)é)a)capacidade)de)um)programa)examinar) (ou)“introspectar”),)manipular)e)até)mesmo) modificar)sua)própria)estrutura)! Em)tempo)de)execução.)!

!!

FIM!

33