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)
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
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
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
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
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
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...
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...
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
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
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”);
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"
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
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
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)
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"
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
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
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.
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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"
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
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
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
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
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
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
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
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
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
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
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
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
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
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)
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"
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
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
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
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
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)
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
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
Java Annotations
                         69


package br.ufscar.dc.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface NumberValidator {

    Class<?> tipo(); // int - long - float - double

    double valorMinimo() default 0d;

    double valorMaximo() default 100d;

    boolean isObrigatorio();

}
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“
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...)
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
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>
Proposta de Caso de Uso
           74
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 /

Introdução à Metaprogramação com Java Reflection API

  • 1.
    Introdução à metaprogramaçãocom 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 emJava 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 emJava 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 emJava 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
  • 69.
    Java Annotations 69 package br.ufscar.dc.annotation; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface NumberValidator { Class<?> tipo(); // int - long - float - double double valorMinimo() default 0d; double valorMaximo() default 100d; boolean isObrigatorio(); }
  • 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 Casode 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>
  • 74.
  • 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 /