SlideShare una empresa de Scribd logo
1 de 75
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 /

Más contenido relacionado

La actualidad más candente

Core java concepts
Core java  conceptsCore java  concepts
Core java conceptsRam132
 
Apresentação Clean Code
Apresentação Clean CodeApresentação Clean Code
Apresentação Clean CodeAndré Leoni
 
Java: Heranca e polimorfismo
Java: Heranca e polimorfismoJava: Heranca e polimorfismo
Java: Heranca e polimorfismoArthur Emanuel
 
Aula 3 introducao a orientação a objetos
Aula 3   introducao a orientação a objetosAula 3   introducao a orientação a objetos
Aula 3 introducao a orientação a objetosRafael Pinheiro
 
13 Java Script - Validação de formulário
13 Java Script  - Validação de formulário13 Java Script  - Validação de formulário
13 Java Script - Validação de formulárioCentro Paula Souza
 
Padroes De Projeto
Padroes De ProjetoPadroes De Projeto
Padroes De Projetoejdn1
 
Arrays (vetores) em Java
Arrays (vetores) em JavaArrays (vetores) em Java
Arrays (vetores) em JavaDaniel Brandão
 
3 2 1 componentes y contenedores swing
3 2 1 componentes y contenedores swing3 2 1 componentes y contenedores swing
3 2 1 componentes y contenedores swingUVM
 
Implementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelImplementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelManoel Pimentel Medeiros
 
Guia practica funciones en java con NetBeans
Guia practica funciones en java con NetBeansGuia practica funciones en java con NetBeans
Guia practica funciones en java con NetBeansEmerson Garay
 
Testes de Software
Testes de SoftwareTestes de Software
Testes de SoftwareCapgemini
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsEduardo Mendes
 
Herramientas de eclipse
Herramientas de eclipseHerramientas de eclipse
Herramientas de eclipseJacqueline98
 

La actualidad más candente (20)

Core java concepts
Core java  conceptsCore java  concepts
Core java concepts
 
Apresentação Clean Code
Apresentação Clean CodeApresentação Clean Code
Apresentação Clean Code
 
Java: Heranca e polimorfismo
Java: Heranca e polimorfismoJava: Heranca e polimorfismo
Java: Heranca e polimorfismo
 
Aula 3 introducao a orientação a objetos
Aula 3   introducao a orientação a objetosAula 3   introducao a orientação a objetos
Aula 3 introducao a orientação a objetos
 
Apostila java completo
Apostila java completoApostila java completo
Apostila java completo
 
Padrão Adapter
Padrão AdapterPadrão Adapter
Padrão Adapter
 
Conceptos basicos POO
Conceptos basicos POOConceptos basicos POO
Conceptos basicos POO
 
13 Java Script - Validação de formulário
13 Java Script  - Validação de formulário13 Java Script  - Validação de formulário
13 Java Script - Validação de formulário
 
Padroes De Projeto
Padroes De ProjetoPadroes De Projeto
Padroes De Projeto
 
Arrays (vetores) em Java
Arrays (vetores) em JavaArrays (vetores) em Java
Arrays (vetores) em Java
 
Visual Basic
Visual BasicVisual Basic
Visual Basic
 
3 2 1 componentes y contenedores swing
3 2 1 componentes y contenedores swing3 2 1 componentes y contenedores swing
3 2 1 componentes y contenedores swing
 
Implementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelImplementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel Pimentel
 
Guia practica funciones en java con NetBeans
Guia practica funciones en java con NetBeansGuia practica funciones en java con NetBeans
Guia practica funciones en java con NetBeans
 
Introduccion a Visual Studio
Introduccion a Visual StudioIntroduccion a Visual Studio
Introduccion a Visual Studio
 
Testes de Software
Testes de SoftwareTestes de Software
Testes de Software
 
Java Basics
Java BasicsJava Basics
Java Basics
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
 
Herramientas de eclipse
Herramientas de eclipseHerramientas de eclipse
Herramientas de eclipse
 
Java colecciones
Java coleccionesJava colecciones
Java colecciones
 

Similar a Introdução à metaprogramação com Java Reflection API

Similar a Introdução à metaprogramação com Java Reflection API (20)

04 api javadoc
04   api javadoc04   api javadoc
04 api javadoc
 
Curso Java Basico
Curso Java BasicoCurso Java Basico
Curso Java Basico
 
Curso de java - Antonio Alves - aula 04
Curso de java - Antonio Alves -  aula 04Curso de java - Antonio Alves -  aula 04
Curso de java - Antonio Alves - aula 04
 
Classes objetos
Classes objetosClasses objetos
Classes objetos
 
Poo slides01
Poo slides01Poo slides01
Poo slides01
 
Aula 03 - Classes math e string - JAVA
Aula 03   - Classes math e string - JAVAAula 03   - Classes math e string - JAVA
Aula 03 - Classes math e string - JAVA
 
Aula 1 6
Aula 1 6Aula 1 6
Aula 1 6
 
Java 07
Java 07Java 07
Java 07
 
Mini aula-java
Mini aula-javaMini aula-java
Mini aula-java
 
Java e orientação a objetos - aula 01
Java e orientação a objetos - aula 01Java e orientação a objetos - aula 01
Java e orientação a objetos - aula 01
 
Pacotes e Encapsulamento
Pacotes e EncapsulamentoPacotes e Encapsulamento
Pacotes e Encapsulamento
 
Pacotes e Encapsulamento
Pacotes e EncapsulamentoPacotes e Encapsulamento
Pacotes e Encapsulamento
 
1707331929 ltp iv java original
1707331929 ltp iv   java original1707331929 ltp iv   java original
1707331929 ltp iv java original
 
http://www.dm.ufscar.br/~waldeck/curso/java/
http://www.dm.ufscar.br/~waldeck/curso/java/http://www.dm.ufscar.br/~waldeck/curso/java/
http://www.dm.ufscar.br/~waldeck/curso/java/
 
Orientação a objetos com PHP
Orientação a objetos com PHPOrientação a objetos com PHP
Orientação a objetos com PHP
 
Curso de Java (Parte 2)
 Curso de Java (Parte 2) Curso de Java (Parte 2)
Curso de Java (Parte 2)
 
Linguagens Poo
Linguagens PooLinguagens Poo
Linguagens Poo
 
v
vv
v
 
Aula4
Aula4Aula4
Aula4
 
Java
JavaJava
Java
 

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
  • 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 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>
  • 74. Proposta de Caso de Uso 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 /