programação orientada a objetos · reflexão)é)a)capacidade)de)um)programa)examinar)...
TRANSCRIPT
BCC221 Programação Orientada a Objetos Prof. Marco Antonio M. Carvalho 2013/1
!!
Avisos!2
3
! Arquivos)
4
! Introdução)ao)Java)Reflection)
5
! 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
! 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
! 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
! 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
! 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
! 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
! 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
! 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
! 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
! 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
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.)
17
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
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
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
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
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
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
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
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
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
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
! 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
! 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
! Os)exemplos)desta)aula)foram)retirados)do)site)GUJ.com.br. ))
! Disponível)em))http://www.guj.com.br/articles/10)
30
31
Perguntas?!
! Prova)! Demonstração)do)TP)
32
!!
FIM!
33