Apresentação com o tema de "Introdução à Metaprogramação com Java Reflection API" apresentada na 11ª edição do evento É Dia de Java na Universidade Federal de São Carlos (UFSCar) em São Carlos nos dias 24 e 25 de Agosto de 2012
Introdução à metaprogramação com Java Reflection API
1. Introdução à metaprogramação com
Java Reflection API
1
G U I L H E R M E D E C L E VA FA R T O
É D I A D E J AVA 2 0 1 2
UNIVERSIDADE FEDERAL DE SÃO CARLOS ( UFSCar)
2. Agenda
2
Objetivos do Minicurso
Metaprogramação
Programação reflexiva em Java
A classe java.lang.Class
A classe java.lang.reflect.Field
A classe java.lang.reflect.Method
A classe java.lang.reflect.Constructor
Java Annotations
A classe java.lang.reflect.AccessibleObject
Proposta de Caso de Uso
3. Apresentação
3
Guilherme de Cleva Farto
Graduação em Bacharelado em Ciência da Computação
FEMA/IMESA – Assis/SP – (2010)
Pós-graduação em Engenharia de Componentes Java
FIO/TNT Educacional – Ourinhos, Lins/SP – (2011)
Analista e desenvolvedor de sistemas Java Web – TOTVS
Próxima (P2RX) – Software and Services
Novas tecnologias (Google Maps API e Google Android)
Automação de sistemas
Integração de sistemas corporativos (EAI)
Professor universitário do curso de Ciência da Computação
FEMA/IMESA – Assis/SP – (2012)
Google Android, Cloud Computing, Google App Engine e Arduino
Autor de diversos artigos, treinamentos e palestras sobre tecnologias Java
e Google, com ênfase em XML, SOA e Web Services
4. Objetivos do Minicurso
4
Apresentar os conceitos de metaprogramação em Java por
meio do uso da Reflection API
Desmitificar as dificuldades ao se utilizar programação
reflexiva (e recursiva)
Fornecer novos (e melhores) mecanismos para auxiliar no
desenvolvimento de software
Apresentar exemplos práticos do uso de programação
reflexiva
5. Metaprogramação
5
É a capacidade de “escrever” programas que representam ou
manipulam outros programas ou a si mesmo, assim como a
seus dados
Vantagens
Criação de aplicativos mais dinâmicos
Redução na quantidade de código-fonte implementado
Minimização de erros
Facilidade de manutenção
Desvantagens
Domínio mais avançado de lógica e programação
Exigência de um maior nível de atenção ao codificar
Dependência da linguagem ou tecnologia
Geração de código complexo
6. Programação reflexiva em Java
6
Java Reflection API
java.lang.reflect.* (contém as classes básicas)
Disponibilizada pela JDK desde a versão 1.1
Provê uma API pequena e segura que suporta introspecção
sobre classes e objetos atuais na JVM
Permite inspecionar e manipular
classes, interfaces, atributos, métodos, entre outros, em
tempo de execução
Permite inspecionar e manipular metainformações
@Annotations
7. Programação reflexiva em Java
7
É possível obter:
A classe de um objeto
O pacote de uma classe
Os modificadores de acesso de uma classe
A superclasse (extends) e as interfaces (implements) de uma classe
Os atributos (características) de uma classe
Os métodos (comportamentos) de uma classe
Os construtores de uma classe
As informações e metainformações (@annotations) de
classes, interfaces, atributos, métodos, entre outros, em tempo de
execução
Entre outros...
8. Programação reflexiva em Java
8
É possível:
Criar uma instância de uma classe dinamicamente
Verificar se um objeto é instância de uma determinada classe
Obter (get) e modificar (set) os valores de atributos de uma
instância
Invocar (executar) métodos de uma instância
Invocar construtores de uma classe
Entre outros...
9. A classe java.lang.Class
9
Utilizada para representar classes Java de maneira que seja
possível obter e manipular informações dinamicamente
Deve-se obter uma instância de java.lang.Class
Não há construtores públicos para a classe java.lang.Class
A JVM automaticamente constrói objetos de java.lang.Class
quando novas classes são carregadas
Embora a classe java.lang.Class devesse pertencer ao pacote
java.lang.reflect, ela foi mantida em java.lang por motivos de
compatibilidade
10. A classe java.lang.Class
10
Por meio de uma instância de java.lang.Class, é possível:
Verificar se o objeto Class representa um tipo de vetor (array)
Verificar se o objeto Class representa um tipo primitivo (boolean,
char, byte, short, int, long, float, double e void)
Verificar qual tipo o objeto Class representa
Verificar o(s) modificador(es) de acesso do objeto Class
Refletir (introspectar) membros (Field, Method e Constructor) do
tipo representado
Verificar se um objeto é instância ou implementa a interface do tipo
representado
Verificar se uma classe ou interface é superclasse ou superinterface
de uma dada classe ou interface
11. A classe java.lang.Class
11
package java.lang;
public final class Class<T> extends Object implements Serializable,
GenericDeclaration, Type, AnnotatedElement {
A partir de um objeto AlunoVO aluno, pode-se obter sua classe:
Class<?> klass = aluno.getClass();
É possível obter uma instância de java.lang.Class em tempo de
compilação:
Class<?> klass = AlunoVO.class;
É possível obter uma instância de java.lang.Class em tempo de
execução:
Class<?> klass = Class.forName(“br.ufscar.dc.vo.AlunoVO”);
12. A classe java.lang.Class
12
toString
public String toString()
Se a instância de java.lang.Class representar uma classe ou vetor (array), irá
retornar uma String contendo a palavra "class", um espaço " ", seguido do nome
totalmente qualificado da classe
Se a instância de java.lang.Class representar uma interface, irá retornar uma
String contendo a palavra "interface", um espaço " ", seguido do nome
totalmente qualificado da interface
Se a instância de java.lang.Class representar um tipo primitivo, irá retornar uma
String contendo o nome do tipo primitivo
Se a instância de java.lang.Class representar o tipo void, irá retornar uma String
contendo a palavra "void"
13. A classe java.lang.Class
13
forName
public static Class forName(String className) throws
ClassNotFoundException
Dado um nome totalmente qualificado para uma classe Java, este método tenta
localizá-la e carregá-la
Se o método for executado com sucesso, irá retornar uma instância de
java.lang.Class representando a classe informada
Se o método falhar, irá lançar a exceção ClassNotFoundException (classe não
encontrada)
Instâncias de classes de tipos primitivos ou void não podem ser obtidas por
meio desse método
14. A classe java.lang.Class
14
newInstance
public Object newInstance() throws InstantiationException,
IllegalAccessException
Cria e inicializa uma nova instância da classe representada pelo objeto de
java.lang.Class (responsável pela invocação)
Este método é dinamicamente equivalente à instanciação pelo construtor
padrão (lista vazia de parâmetros)
Se o método for executado com sucesso, irá retornar um objeto criado e iniciado
da classe utilizada na invocação
O método irá lançar a exceção IllegalAccessException se a classe ou o
inicializador não for acessível
O método irá lançar a exceção InstantiationException se a classe for abstrata ou
se for uma interface, assim como na tentativa de instanciar um objeto do tipo
primitivo ou void
15. A classe java.lang.Class
15
isInstance
public boolean isInstance(Object obj)
Este método é dinamicamente equivalente ao operador "instanceof"
O método irá retornar "true" se o objeto passado como parâmetro for diferente
de "null" e puder ser convertido (cast) para um tipo de referência da instância
java.lang.Class responsável pela invocação. Caso contrário, o método irá
retornar "false". O método também irá retornar "false" se a instância de
java.lang.Class for do tipo primitivo ou void
Se o método falhar, irá lançar a exceção ClassCastException (erro ao realizar
cast)
16. A classe java.lang.Class
16
isInterface
public boolean isInterface()
Se a instância de java.lang.Class representar uma interface, irá retornar "true";
caso contrário, irá retornar "false"
isArray
public boolean isArray()
Se a instância de java.lang.Class representar um tipo de vetor (array), irá
retornar "true"; caso contrário, irá retornar "false"
17. A classe java.lang.Class
17
isPrimitive
public boolean isPrimitive()
Se a instância de java.lang.Class representar um tipo primitivo, irá retornar
"true"; caso contrário, irá retornar "false"
Há nove tipos primitivos pré-definidos:
java.lang.Boolean.TYPE
java.lang.Character.TYPE
java.lang.Byte.TYPE
java.lang.Short.TYPE
java.lang.Integer.TYPE
java.lang.Long.TYPE
java.lang.Float.TYPE
java.lang.Double.TYPE
java.lang.Void.TYPE
18. A classe java.lang.Class
18
getName
public String getName()
Retorna uma String contendo o nome totalmente qualificado da classe
(declarada ou vetor), interface, tipo primitivo ou void
getSimpleName
public String getSimpleName()
Retorna uma String contendo o nome simplificado da classe (declarada ou
vetor), interface, tipo primitivo ou void
getPackage
public Package getPackage()
Retorna uma instância de java.lang.Package contendo o pacote (package) da
classe (declarada ou vetor), interface ou tipo primitivo
19. A classe java.lang.Class
19
getModifiers
public int getModifiers()
Retorna um inteiro (int) representando o(s) modificador(es) de acesso da classe
ou interface
Os modificadores de acesso são constantes para "public", "protected", "private",
"final", "interface“ e demais
Pode-se utilizar a instrução "Modifier.toString(int)" para recuperar uma String
contendo o(s) modificador(es) de acesso conforme valor informado
getSuperclass
public Class getSuperclass()
Se a instância de java.lang.Class estender (ou herdar) de outra classe, irá
retornar uma nova instância de java.lang.Class representando a superclasse.
O método irá retornar "null" se a instância de java.lang.Class representar a
classe Object ou se representar uma interface ou tipo primitivo.
20. A classe java.lang.Class
20
getInterfaces
public Class[] getInterfaces()
Método utilizado por retornar um vetor (array) de instâncias de java.lang.Class
contendo todas as interfaces representadas pela instância de java.lang.Class
responsável pela invocação
O método irá retornar um vetor (array) de tamanho 0 se a instância de
java.lang.Class não implementar nenhuma interface
getDeclaringClass
public Class getDeclaringClass()
Método responsável por recuperar uma instância de java.lang.Class da classe ao
qual a responsável pela invocação pertence
O método irá retornar "null" se a classe ou interface não é membro de nenhuma
outra classe
21. A classe java.lang.Class
21
getFields
public Field[] getFields() throws SecurityException
Método responsável por recuperar um vetor (array) de instâncias de
java.lang.reflect.Field contendo todos os atributos públicos da instância de
java.lang.Class responsável pela invocação
O método irá retornar um vetor (array) de tamanho 0 se a instância de
java.lang.Class não possuir nenhum atributo público acessível
O método irá lançar a exceção SecurityException se o acesso às informações dos
atributos for negado
22. A classe java.lang.Class
22
getDeclaredFields
public Field[] getDeclaredFields() throws SecurityException
Método responsável por recuperar um vetor (array) de instâncias de
java.lang.reflect.Field contendo todos os atributos, independente do(s)
modificador(es) de acesso, da instância de java.lang.Class responsável pela
invocação
O método irá retornar um vetor (array) de tamanho 0 se a instância de
java.lang.Class não possuir nenhum atributo ou se ela representar um tipo
primitivo
O método irá lançar a exceção SecurityException se o acesso às informações dos
atributos for negado
23. A classe java.lang.Class
23
getField
public Field getField(String name) throws NoSuchFieldException,
SecurityException
Método responsável por recuperar uma instância de java.lang.reflect.Field
contendo o atributo público da instância de java.lang.Class responsável pela
invocação a partir do nome passado como parâmetro
O método irá lançar a exceção NoSuchFieldException se o atributo não existir
O método irá lançar a exceção SecurityException se o acesso às informações do
atributo for negado
24. A classe java.lang.Class
24
getDeclaredField
public Field getDeclaredField(String name) throws
NoSuchFieldException, SecurityException
Método responsável por recuperar uma instância de java.lang.reflect.Field
contendo o atributo, independente do(s) modificador(es) de acesso, da instância
de java.lang.Class responsável pela invocação a partir do nome passado como
parâmetro
O método irá lançar a exceção NoSuchFieldException se o atributo não existir
O método irá lançar a exceção SecurityException se o acesso às informações do
atributo for negado
25. A classe java.lang.Class
25
getMethods
public Method[] getMethods() throws SecurityException
Método responsável por recuperar um vetor (array) de instâncias de
java.lang.reflect.Method contendo todos os métodos públicos da instância de
java.lang.Class responsável pela invocação
O método irá retornar um vetor (array) de tamanho 0 se a instância de
java.lang.Class não possuir nenhum método público
O método irá lançar a exceção SecurityException se o acesso às informações dos
métodos for negado
26. A classe java.lang.Class
26
getDeclaredMethods
public Method[] getDeclaredMethods() throws SecurityException
Método responsável por recuperar um vetor (array) de instâncias de
java.lang.reflect.Method contendo todos os métodos, independente do(s)
modificador(es) de acesso, da instância de java.lang.Class responsável pela
invocação
O método irá retornar um vetor (array) de tamanho 0 se a instância de
java.lang.Class não possuir nenhum método ou se ela representar um tipo
primitivo
O método irá lançar a exceção SecurityException se o acesso às informações dos
métodos for negado
27. A classe java.lang.Class
27
getMethod
public Method getMethod(String name, Class[] parameterTypes)
throws NoSuchMethodException, SecurityException
Método responsável por recuperar uma instância de java.lang.reflect.Method
contendo o método público da instância de java.lang.Class responsável pela
invocação a partir do nome e da lista (vetor de java.lang.Class) de tipos de
parâmetros (em ordem) passados como parâmetros
O método irá lançar a exceção NoSuchMethodException se o método não existir
O método irá lançar a exceção SecurityException se o acesso às informações do
método for negado
28. A classe java.lang.Class
28
getDeclaredMethod
public Method getDeclaredMethod(String name,
Class[] parameterTypes) throws NoSuchMethodException,
SecurityException
Método responsável por recuperar uma instância de java.lang.reflect.Method
contendo o método, independente do(s) modificador(es) de acesso, da instância
de java.lang.Class responsável pela invocação a partir do nome e da lista (vetor
de java.lang.Class) de tipos de parâmetros (em ordem) passados como
parâmetros
O método irá lançar a exceção NoSuchMethodException se o método não existir
O método irá lançar a exceção SecurityException se o acesso às informações do
método for negado
29. A classe java.lang.Class
29
getConstructors
public Constructor[] getConstructors() throws SecurityException
Método responsável por recuperar um vetor (array) de instâncias de
java.lang.reflect.Constructor contendo todos os construtores públicos da
instância de java.lang.Class responsável pela invocação
O método irá retornar um vetor (array) de tamanho 0 se a instância de
java.lang.Class não possuir nenhum construtor público ou se ela representar um
tipo primitivo
O método irá lançar a exceção SecurityException se o acesso às informações dos
construtores for negado
30. A classe java.lang.Class
30
getDeclaredConstructors
public Constructor[] getDeclaredConstructors() throws
SecurityException
Método responsável por recuperar um vetor (array) de instâncias de
java.lang.reflect.Constructor contendo todos os construtores, independente
do(s) modificador(es) de acesso, da instância de java.lang.Class responsável pela
invocação
O método irá retornar um vetor (array) de tamanho 0 se a instância de
java.lang.Class não possuir nenhum construtor ou se ela representar um tipo
primitivo
O método irá lançar a exceção SecurityException se o acesso às informações dos
construtores for negado
31. A classe java.lang.Class
31
getConstructor
public Constructor getConstructor(Class[] parameterTypes) throws
NoSuchMethodException, SecurityException
Método responsável por recuperar uma instância de
java.lang.reflect.Constructor contendo o construtor público da instância de
java.lang.Class responsável pela invocação a partir da lista (vetor de
java.lang.Class) de tipos de parâmetros (em ordem) passada como parâmetro
O método irá lançar a exceção NoSuchMethodException se o construtor não
existir
O método irá lançar a exceção SecurityException se o acesso às informações do
construtor for negado
32. A classe java.lang.Class
32
getDeclaredConstructor
public Constructor getDeclaredConstructor(Class[] parameterTypes)
throws NoSuchMethodException, SecurityException
Método responsável por recuperar uma instância de
java.lang.reflect.Constructor contendo o construtor, independente do(s)
modificador(es) de acesso, da instância de java.lang.Class responsável pela
invocação a partir da lista (vetor de java.lang.Class) de tipos de parâmetros (em
ordem) passada como parâmetro
O método irá lançar a exceção NoSuchMethodException se o construtor não
existir
O método irá lançar a exceção SecurityException se o acesso às informações do
construtor for negado
33. A classe java.lang.reflect.Field
33
Provê acesso às informações de um atributo de uma classe ou
interface
O atributo refletido (ou introspectado) deve ser uma variável
de classe (campo estático) ou de instância
Apenas a JVM deve criar instâncias de java.lang.reflect.Field
Código reflexivo deve obter referências por meio dos métodos
getField, getFields, getDeclaredField e getDeclaredFields de uma
instância de java.lang.Class
Permite conversão de ampliação (widening cast) durante
operações de recuperação (get) e atribuição (set)
Irá lançar a exceção IllegalArgumentException se uma conversão de
redução (narrowing cast) ocorrer
34. A classe java.lang.reflect.Field
34
package java.lang.reflect;
public final class Field extends AccessibleObject implements Member {
getDeclaringClass
public Class getDeclaringClass()
Método responsável por recuperar uma instância de java.lang.Class da classe ou
interface que declara o atributo representado pela instância de
java.lang.reflect.Field
getName
public String getName()
Método responsável por recuperar uma String contendo o nome do atributo
representado pela instância de java.lang.reflect.Field
35. A classe java.lang.reflect.Field
35
getModifiers
public int getModifiers()
Retorna um inteiro (int) representando o(s) modificador(es) de acesso da classe
ou interface
Pode-se utilizar a instrução "Modifier.toString(int)" para recuperar uma String
contendo o(s) modificador(es) de acesso conforme valor informado
setAccessible
public void setAccessible(boolean flag) throws SecurityException
Método responsável por fornecer permissão de acesso de leitura (get) e
gravação (set) à instância de java.lang.reflect.Field
36. A classe java.lang.reflect.Field
36
getType
public Class getType()
Método responsável por retornar uma instância de java.lang.Class indicando o
tipo do atributo representado pela instância de java.lang.reflect.Field
equals
public boolean equals(Object obj)
Método responsável por verificar se dois atributos representados por instâncias
de java.lang.reflect.Field são iguais. O método irá retornar "true" se as
instâncias forem iguais; caso contrário, irá retornar "false"
Os atributos são iguais se eles possuirem a mesma classe declarante e o mesmo
nome
37. A classe java.lang.reflect.Field
37
get
public Object get(Object obj) throws NullPointerException,
IllegalArgumentException, IllegalAccessException
Método responsável por recuperar uma instância de Object com o valor contido
na instância de java.lang.reflect.Field (responsável pela invocação)
O valor é automaticamente transformado (wrapped) se o objeto for do tipo
primitivo
O método irá lançar a exceção NullPointerException se o objeto passado como
parâmetro for igual a "null"
O método irá lançar a exceção IllegalArgumentException se o objeto passado
como parâmetro não pertencer ao tipo do atributo representado pela instância
de java.lang.reflect.Field
O método irá lançar a exceção IllegalAccessException se o atributo representado
pela instância de java.lang.reflect.Field não for acessível
38. A classe java.lang.reflect.Field
38
getBoolean
public boolean getBoolean(Object obj) throws NullPointerException,
IllegalArgumentException, IllegalAccessException
Método responsável por recuperar uma instância de boolean com o valor
contido na instância de java.lang.reflect.Field (responsável pela invocação)
O método irá lançar a exceção IllegalArgumentException se o atributo
representado pela instância de java.lang.reflect.Field não for do tipo boolean
39. A classe java.lang.reflect.Field
39
getByte
public byte getByte(Object obj) throws NullPointerException,
IllegalArgumentException, IllegalAccessException
Método responsável por recuperar uma instância de byte com o valor contido na
instância de java.lang.reflect.Field (responsável pela invocação)
O método irá lançar a exceção IllegalArgumentException se o atributo
representado pela instância de java.lang.reflect.Field não for do tipo byte
40. A classe java.lang.reflect.Field
40
getChar
public char getChar(Object obj) throws NullPointerException,
IllegalArgumentException, IllegalAccessException
Método responsável por recuperar uma instância de char com o valor contido na
instância de java.lang.reflect.Field (responsável pela invocação)
O método irá lançar a exceção IllegalArgumentException se o atributo
representado pela instância de java.lang.reflect.Field não for do tipo char
41. A classe java.lang.reflect.Field
41
getShort
public short getShort(Object obj) throws NullPointerException,
IllegalArgumentException, IllegalAccessException
Método responsável por recuperar uma instância de short com o valor contido
na instância de java.lang.reflect.Field (responsável pela invocação)
O método irá lançar a exceção IllegalArgumentException se o atributo
representado pela instância de java.lang.reflect.Field não for do tipo short
42. A classe java.lang.reflect.Field
42
getInt
public int getInt(Object obj) throws NullPointerException,
IllegalArgumentException, IllegalAccessException
Método responsável por recuperar uma instância de int com o valor contido na
instância de java.lang.reflect.Field (responsável pela invocação)
O método irá lançar a exceção IllegalArgumentException se o atributo
representado pela instância de java.lang.reflect.Field não for do tipo int
43. A classe java.lang.reflect.Field
43
getLong
public long getLong(Object obj) throws NullPointerException,
IllegalArgumentException, IllegalAccessException
Método responsável por recuperar uma instância de long com o valor contido na
instância de java.lang.reflect.Field (responsável pela invocação)
O método irá lançar a exceção IllegalArgumentException se o atributo
representado pela instância de java.lang.reflect.Field não for do tipo long
44. A classe java.lang.reflect.Field
44
getFloat
public float getFloat(Object obj) throws NullPointerException,
IllegalArgumentException, IllegalAccessException
Método responsável por recuperar uma instância de float com o valor contido
na instância de java.lang.reflect.Field (responsável pela invocação)
O método irá lançar a exceção IllegalArgumentException se o atributo
representado pela instância de java.lang.reflect.Field não for do tipo float
45. A classe java.lang.reflect.Field
45
getDouble
public double getDouble(Object obj) throws NullPointerException,
IllegalArgumentException, IllegalAccessException
Método responsável por recuperar uma instância de double com o valor contido
na instância de java.lang.reflect.Field (responsável pela invocação)
O método irá lançar a exceção IllegalArgumentException se o atributo
representado pela instância de java.lang.reflect.Field não for do tipo double
46. A classe java.lang.reflect.Field
46
set
public void set(Object obj, Object value) throws
NullPointerException, IllegalArgumentException,
IllegalAccessException
Método responsável por atribuir uma instância de Object na instância de
java.lang.reflect.Field (responsável pela invocação)
O valor é automaticamente transformado (wrapped) se o objeto for do tipo
primitivo
O método irá lançar a exceção NullPointerException se o objeto passado como
parâmetro for igual a "null"
O método irá lançar a exceção IllegalArgumentException se o objeto passado
como parâmetro não pertencer ao tipo do atributo representado pela instância
de java.lang.reflect.Field
O método irá lançar a exceção IllegalAccessException se o atributo representado
pela instância de java.lang.reflect.Field não for acessível ou se possuir o
modificador de acesso "final"
47. A classe java.lang.reflect.Field
47
setBoolean
public void setBoolean(Object obj, boolean z) throws
NullPointerException, IllegalArgumentException,
IllegalAccessException
Método responsável por atribuir um valor de boolean na instância de
java.lang.reflect.Field (responsável pela invocação)
O método irá lançar a exceção IllegalArgumentException se o atributo
representado pela instância de java.lang.reflect.Field não for do tipo boolean
48. A classe java.lang.reflect.Field
48
setByte
public void setByte(Object obj, byte b) throws NullPointerException,
IllegalArgumentException, IllegalAccessException
Método responsável por atribuir um valor de byte na instância de
java.lang.reflect.Field (responsável pela invocação)
O método irá lançar a exceção IllegalArgumentException se o atributo
representado pela instância de java.lang.reflect.Field não for do tipo byte
49. A classe java.lang.reflect.Field
49
setChar
public void setChar(Object obj, char c) throws NullPointerException,
IllegalArgumentException, IllegalAccessException
Método responsável por atribuir um valor de char na instância de
java.lang.reflect.Field (responsável pela invocação)
O método irá lançar a exceção IllegalArgumentException se o atributo
representado pela instância de java.lang.reflect.Field não for do tipo char
50. A classe java.lang.reflect.Field
50
setShort
public void setShort(Object obj, short s) throws
NullPointerException,
IllegalArgumentException, IllegalAccessException
Método responsável por atribuir um valor de short na instância de
java.lang.reflect.Field (responsável pela invocação)
O método irá lançar a exceção IllegalArgumentException se o atributo
representado pela instância de java.lang.reflect.Field não for do tipo short
51. A classe java.lang.reflect.Field
51
setInt
public void setInt(Object obj, int i) throws NullPointerException,
IllegalArgumentException, IllegalAccessException
Método responsável por atribuir um valor de int na instância de
java.lang.reflect.Field (responsável pela invocação)
O método irá lançar a exceção IllegalArgumentException se o atributo
representado pela instância de java.lang.reflect.Field não for do tipo int
52. A classe java.lang.reflect.Field
52
setLong
public void setLong(Object obj, long l) throws NullPointerException,
IllegalArgumentException, IllegalAccessException
Método responsável por atribuir um valor de long na instância de
java.lang.reflect.Field (responsável pela invocação)
O método irá lançar a exceção IllegalArgumentException se o atributo
representado pela instância de java.lang.reflect.Field não for do tipo long
53. A classe java.lang.reflect.Field
53
setFloat
public void setFloat(Object obj, float f) throws NullPointerException,
IllegalArgumentException, IllegalAccessException
Método responsável por atribuir um valor de float na instância de
java.lang.reflect.Field (responsável pela invocação)
O método irá lançar a exceção IllegalArgumentException se o atributo
representado pela instância de java.lang.reflect.Field não for do tipo float
54. A classe java.lang.reflect.Field
54
setDouble
public void setDouble(Object obj, double d) throws
NullPointerException, IllegalArgumentException,
IllegalAccessException
Método responsável por atribuir um valor de double na instância de
java.lang.reflect.Field (responsável pela invocação)
O método irá lançar a exceção IllegalArgumentException se o atributo
representado pela instância de java.lang.reflect.Field não for do tipo double
55. A classe java.lang.reflect.Method
55
Provê acesso às informações de um método de uma classe ou
interface
O método refletido (ou introspectado) deve ser um método
abstrato, um método de classe (método estático) ou de instância
Apenas a JVM deve criar instâncias de java.lang.reflect.Method
Código reflexivo deve obter referências por meio dos métodos
getMethod, getMethods, getDeclaredMethod e
getDeclaredMethods de uma instância de java.lang.Class
Permite conversão de ampliação (widening cast) nos parâmetros
de invocação do método
Irá lançar a exceção IllegalArgumentException se uma conversão de
redução (narrowing cast) ocorrer
56. A classe java.lang.reflect.Method
56
package java.lang.reflect;
public final class Method extends AccessibleObject implements
GenericDeclaration, Member {
getDeclaringClass
public Class getDeclaringClass()
Método responsável por recuperar uma instância de java.lang.Class da classe ou
interface que declara o método representado pela instância de
java.lang.reflect.Method
getName
public String getName()
Método responsável por recuperar uma String contendo o nome do método
representado pela instância de java.lang.reflect.Method
57. A classe java.lang.reflect.Method
57
getModifiers
public int getModifiers()
Retorna um inteiro (int) representando o(s) modificador(es) de acesso da classe
ou interface
Pode-se utilizar a instrução "Modifier.toString(int)" para recuperar uma String
contendo o(s) modificador(es) de acesso conforme valor informado
getReturnType
public Class getReturnType()
Método responsável por recuperar uma instância de java.lang.Class
representando o tipo de retorno do método
58. A classe java.lang.reflect.Method
58
getParameterTypes
public Class[] getParameterTypes()
Método responsável por recuperar um vetor (array) de instâncias de
java.lang.Class representando os tipos de parâmetros, na ordem de declaração,
do método representando pela instância de java.lang.reflect.Method
O método irá retornar um vetor (array) de tamanho 0 se a instância de
java.lang.reflect.Method não possuir nenhum parâmetro
59. A classe java.lang.reflect.Method
59
getExceptionTypes
public Class[] getExceptionTypes()
Método responsável por recuperar um vetor (array) de instâncias de
java.lang.Class representando os tipos de exceções do método representando
pela instância de java.lang.reflect.Method
O método irá retornar um vetor (array) de tamanho 0 se a instância de
java.lang.reflect.Method não possuir nenhuma exceção
60. A classe java.lang.reflect.Method
60
equals
public boolean equals(Object obj)
Método responsável por verificar se dois métodos representados por instâncias
de java.lang.reflect.Method são iguais. O método irá retornar "true" se as
instâncias forem iguais; caso contrário, irá retornar "false"
Os métodos são iguais se eles possuirem a mesma classe declarante, o mesmo
nome e o(s) mesmo(s) tipo(s) de parâmetro(s)
61. A classe java.lang.reflect.Method
61
invoke
public Object invoke(Object obj, Object[] args) throws
NullPointerException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException
Método responsável por invocar um método representado pela instância de
java.lang.reflect.Method no objeto passado como parâmetro, utilizando-se a
lista de parâmetros informada. O valor de retorno do método será retornado
após a execução
O valor retornado pelo método é automaticamente transformado (wrapped) se
o objeto for do tipo primitivo
O método irá lançar a exceção NullPointerException se o objeto passado como
parâmetro for igual a "null"
O método irá lançar a exceção IllegalArgumentException se a lista de
parâmetros não possuir os mesmos tipos da lista de parâmetros do método ou
se o número de parâmetros for diferente da quantidade de parâmetros
requeridos pelo método
Caso o método representado pela instância de java.lang.reflect.Method não
possuir parâmetros, deverá ser passado um vetor (array) vazio (0 elementos) ou
"null"
62. A classe java.lang.reflect.Constructor
62
Provê acesso às informações de um construtor de uma classe
Uma instância de java.lang.reflect.Constructor deve ser utilizada
para criar e inicializar uma nova instância de uma classe que
declara o construtor refletido (ou introspectado), desde que a
classe possa ser instanciada
Apenas a JVM deve criar instâncias de java.lang.reflect.Method
Código reflexivo deve obter referências por meio dos métodos
getConstructor, getConstructors, getDeclaredConstructor e
getDeclaredConstructors de uma instância de java.lang.Class
Uma instância de java.lang.reflect.Constructor permite conversão
de ampliação (widening cast) nos parâmetros de invocação do
construtor
Irá lançar a exceção IllegalArgumentException se uma conversão de
redução (narrowing cast) ocorrer
63. A classe java.lang.reflect.Constructor
63
package java.lang.reflect;
public final class Constructor<T> extends AccessibleObject implements
GenericDeclaration, Member {
getDeclaringClass
public Class getDeclaringClass()
Método responsável por recuperar uma instância de java.lang.Class da classe
que declara o construtor representado pela instância de
java.lang.reflect.Constructor
getName
public String getName()
Método responsável por recuperar uma String contendo o nome do construtor
representado pela instância de java.lang.reflect.Constructor
64. A classe java.lang.reflect.Constructor
64
getModifiers
public int getModifiers()
Retorna um inteiro (int) representando o(s) modificador(es) de acesso da classe
ou interface
Pode-se utilizar a instrução "Modifier.toString(int)" para recuperar uma String
contendo o(s) modificador(es) de acesso conforme valor informado
getParameterTypes
public Class[] getParameterTypes()
Método responsável por recuperar um vetor (array) de instâncias de
java.lang.Class representando os tipos de parâmetros, na ordem de
declaração, do construtor representando pela instância de
java.lang.reflect.Constructor
O método irá retornar um vetor (array) de tamanho 0 se a instância de
java.lang.reflect.Constructor não possuir nenhum parâmetro
65. A classe java.lang.reflect.Constructor
65
getExceptionTypes
public Class[] getExceptionTypes()
Método responsável por recuperar um vetor (array) de instâncias de
java.lang.Class representando os tipos de exceções do método representando
pela instância de java.lang.reflect.Constructor
O método irá retornar um vetor (array) de tamanho 0 se a instância de
java.lang.reflect.Constructor não possuir nenhuma exceção
66. A classe java.lang.reflect.Constructor
66
equals
public boolean equals(Object obj)
Método responsável por verificar se dois construtores representados por
instâncias de java.lang.reflect.Constructor são iguais. O método irá retornar
"true" se as instâncias forem iguais; caso contrário, irá retornar "false"
Os construtores são iguais se eles possuirem a mesma classe declarante e o(s)
mesmo(s) tipo(s) de parâmetro(s)
67. A classe java.lang.reflect.Constructor
67
newInstance
public Object newInstance(Object initargs[]) throws
InstantiationException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException
Cria e inicializa uma nova instância da classe por meio da instância de
java.lang.reflect.Constructor, a partir da lista de parâmetros informada
Se o método for executado com sucesso, irá retornar um objeto criado e iniciado
da classe declarante do construtor utilizado na invocação
O método irá lançar a exceção IllegalAccessException se a classe ou o
inicializador não é acessível por meio do objeto java.lang.Class
O método irá lançar a exceção InstantiationException se a classe for abstrata ou
for uma interface, assim como na tentativa de instanciar um objeto do tipo
primitivo ou void
68. Java Annotations
68
Disponibilizada pela JDK desde a versão 1.5
Metadados que podem ser acoplados a vários elementos de
codificação para posterior recuperação
Recuperados em tempo de compilação (compile-time) ou execução
(runtime)
Exemplos:
classes, interfaces, atributos, métodos, construtores, entre outros...
Proveem informações adicionais ao código
Podem ser utilizadas por ferramentas e/ou frameworks
Exemplo: controlar o modo de execução de um compilador ou
configurar uma aplicação em tempo de execução
70. A classe java.lang.reflect.AccessibleObject
70
isAnnotationPresent
public boolean isAnnotationPresent(Class<? extends Annotation>
annotationClass)
Método responsável por verificar a existência de uma anotação a partir da
instância de java.lang.Class informada
O método irá retornar "true" se a anotação existir; caso contrário, irá retornar
"false“
71. A classe java.lang.reflect.AccessibleObject
71
getAnnotation
public <T extends Annotation> T
getAnnotation(Class<T> annotationClass)
Método responsável por recuperar uma instância de
java.lang.annotation.Annotation contendo a anotação da instância de
java.lang.Class informada
O método irá retornar "null" se a anotação não existir no membro
(classe, interface, atributo, método, construtor, entre outros...)
72. A classe java.lang.reflect.AccessibleObject
72
getDeclaredAnnotations
public Annotation[] getDeclaredAnnotations()
Método responsável por recuperar um vetor (array) de instâncias de
java.lang.annotation.Annotation contendo todas as anotações da instância de
java.lang.Class responsável pela invocação
O método irá retornar um vetor (array) de tamanho 0 se a instância de
java.lang.Class não possuir nenhuma anotação
73. Proposta de Caso de Uso
73
Criar um mecanismo de transformação (marshall) de Java
Objects para XML
Exemplo:
AlunoVO guilherme = new AlunoVO(123, “Guilherme”);
CursoVO...
DisciplinaVO...
<aluno>
<ra>123</ra>
<nome><![CDATA[Guilherme]]></nome>
</aluno>
75. Dúvidas ?
75
G U I L H E R M E D E C L E VA FA R T O
guilherme_computacao@yahoo.com.br
guilherme.farto@gmail.com
@gcleva
h t t p : / / w w w. f e m a . e d u . b r /