1 / 25

Metaprogramação – API Reflection da linguagem Java Paulo Eduardo Papotti

Metaprogramação – API Reflection da linguagem Java Paulo Eduardo Papotti Prof. Dr. Antonio Francisco do Prado. Metraprogramação. “Metaprogramação é a programação de programas que escrevem ou manipulam outros programas (ou a si próprios) assim como seus dados.” Vantagens → Maior produtividade

silver
Download Presentation

Metaprogramação – API Reflection da linguagem Java Paulo Eduardo Papotti

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Metaprogramação – API Reflection da linguagem Java Paulo Eduardo Papotti Prof. Dr. Antonio Francisco do Prado

  2. Metraprogramação “Metaprogramação é a programação de programas que escrevem ou manipulam outros programas (ou a si próprios) assim como seus dados.” Vantagens → Maior produtividade → Menos código Desvatagens → Maior cuidado na hora de programar → Nem todas as linguagens oferecem esse recurso

  3. Metaclasse “Em orientação a objetos, uma metaclasse é uma classe cujas instâncias também são classes e não objetos no sentido tradicional. Assim como classes definem o comportamento de certos objetos, metaclasses definem o comportamento de certas classes e suas instâncias.” Em Java: Class classe = Aluno.class;

  4. Fatorial em tempo de compilação #include<iostream> usingnamespace std; template <int N> // Esta é a definição do template struct Fatorial { staticconstint valor = N * Fatorial<N - 1>::valor; }; template <> // Esta é a definição do caso base struct Fatorial<0> { staticconstint valor = 1; }; int main (int argc, char *argv[]) { cout << Fatorial<5>::valor << endl; cout << Fatorial<2>::valor << endl; return 0; }

  5. Java Reflection API

  6. Java manipulando Java • Uma das capacidades incomuns do Java é que um programa pode analisar a si próprio. • É possível descobrir: • A classe de um objeto • Modificadores de acesso, superclasse, campos, construtores e métodos. • Se a classe implementa uma interface. • É possível fazer: • Criar instancia da classe • Obter e modificar a variaveis de instância. • Invocar um método de uma classe.

  7. Para que serve Reflection? • Em programas comuns não é necessário usar Reflection. • Usa-se Reflection se o seu programa necessita processar o próprio programa ou outros programas. • Exemplos típicos: • Um navegador de classes • Um depurador • Um construtor de GUI • Uma IDE, tal como Netbeans ou Eclipse

  8. A classe Class • Para obter informações sobre uma classe, é necessário seu objeto Class. • Se você tem um objeto obj, você pode obter seu objeto classe através:Class c = obj.getClass(); • Você pode obter a classe da superclasse de uma Class c através:Class sup = c.getSuperclass(); • Se você souber o nome da classe em tempo de compilação, você pode obter seu objeto classe através:Class c = Aluno.class; • Se você souber o nome da classe em tempo de execução em uma String str, o objeto classe pode ser obtido através:Class c = class.forName(str);

  9. Obetndo o nome da classe • Se você tem uma classe de objeto c, pode-se obter o nome da classe com o comando c.getName() • getName retorna o nome completo da classe (incluindo pacotes),Class c = Button.class; String s = c.getName(); System.out.println(s);irá exibir:java.awt.Button • A classe Class e seus métodos estão em java.lang, que é um pacote de classes que sempre é importado para qualquer programa Java.

  10. Obtendo os modificadores de um objeto Class • Os modificadores (public, final, abstract etc.) de um objeto Class podem ser acessados através do método getModifiers(). • Um modifier é na verdade um int mas a classe Modifier possui métodos para definir qual é o tipo do modificador. Por exemplo: if (Modifier.isPublic(m)) System.out.println("public");

  11. Obtendo os modificadores de um objeto Class • Modifier contém esses métodos (entre outros): • public static boolean isAbstract(int) • public static boolean isFinal(int) • public static boolean isInterface(int) • public static boolean isPrivate(int) • public static boolean isProtected(int) • public static boolean isPublic(int) • public static String toString(int)

  12. Obtendo interfaces • Para saber quais interfaces um objeto Class implementa basta chamar o método getInterfaces(), que retorna um array de objetos Class. • Ex: static void printInterfaceNames(Objecto) { Class c = o.getClass(); Class[] allInterfaces = c.getInterfaces(); for (Class inf: allInterfaces) { System.out.println(inf.getName()); } }

  13. Examinando classes e interfaces • A classe Class representa tanto classes quanto interfaces • Para determinar se um objeto c do tipo Class é uma interface, use-sa c.isInterface() • Métodos úteis de um objeto Class são: • getModifiers() • getFields() • getConstructors() • getMethods() • isArray()

  14. Obtendo Fields • public Field[] getFields() throws SecurityException • Retorna um array deField(somente atributos públicos incluindo atributos herdados). • O tamanho do array pode ser zero • Não existe uma ordem definida para retornar os atributos, mas, em geral, eles vem na ordem que foram declarados • pulic Field getField(String name) throws NoSuchFieldException, SecurityException • Retorna o objetoField de um determinado atributo (apenas público) • Para acessar atributos privados também, usa-se o métodopublic Field[] getDeclaredFields() e pulic Field getDeclaredField(String name)

  15. Usando Fields • Se f é um objeto Field então • f.getName()retorna o nome simples do atributo • f.getType()retorna o tipo (Class) do atributo • f.getModifiers()retorna os Modifiersdo atributo • f.toString()retorna uma String contendo modificadores de acesso, o tipo, e o nome completo do atributo • Example:public java.lang.String Person.name

  16. Usando Fields • Os atributos de um objeto obj podem ser acessador através: • boolean f.getBoolean(obj), int f.getInt(obj), double f.getDouble(obj), etc., retornam o valor do atributo desde que seja do tipo correto (tipos primitivos) • Object f.get(obj)retorna o atributo (objetos) • void f.set(obj, value), void f.setBoolean(obj, bool), void f.setInt(obj, i), voidf.getDouble(obj, d), etc. seta o valor do atributo;

  17. Obtendo Construtores de uma classe • Se c é um objeto Class, então • c.getConstructors() : Constructor[] retorna um array de todos os construtores públicos de uma da classe c. • c.getConstructor( Class … paramTypes ) retorna um construtor que possua os mesmos parâmetros dados por paramTypes. Ex: • String.class.getConstructors().length > 15; // A classe String possui 15 construtores públicos • String.class.getConstrucor( char[].class, int.class, int.class).toString() > String(char[], int,int).

  18. Construtores • Se c é um objeto Constructor, então • c.getName()retorna o nome do construtor em uma String (é o mesmo nome da classe) • c.getDeclaringClass()retorna aClassno qual o construtor foi declarado • c.getModifiers()retorna osModifier do construtor • c.getParameterTypes()retorna um array de objetosClass na ordem que foram declarados • c.newInstance(Object… initargs)cria e retorna um nova instância da classec

  19. Exemplo • Constructor c = String.class.getConstrucor( char[].class, int.class, int.class).toString() • String(char[], int,int). String s = c.newInstance( new char[] {‘a’,’b’,’c’,’d’ }, 1, 2 ); • s = “bc”;

  20. A classe Method • public Method[] getMethods() throws SecurityException Retorna um array de objetosMethod (apenas métodos públicos de uma classe ou interface, incluindo métodos herdados) Não há ordem específicas que os métodos são retornados public Method getMethod(String name, Class… parameterTypes)throws NoSuchMethodException, SecurityException

  21. Methods • getDeclaringClass() → Retorna o objeto Class representando a classe ou interface que declarou o método • getName() → Retorna o nome do método em uma String • getModifiers() → Retorna os modificadores do método em formato int. • getParameterTypes() → Retorna um array de objetos Class que representam os tipos dos parâmetros do método em questão.

  22. Methods • getReturnType() → Retorna o objeto Classque representa o tipo de retorno do método • toString() → Retorna uma String que descreve o método • public Object invoke(Object obj, Object… args) → Invoca o método, de um determinado objeto com parâmetros especificados.

  23. Examplos de invoke() • “abcdefg”.length() >> 7 • Method lengthMethod = String.class.getMethod(“length”) ; • lengthMethod.invoke(“abcdefg”) >> 7 • “abcdefg”.substring(2, 5) >> cde • Method substringMethod = String.class.getMethod ( “substring”, int.class, Integer.TYPE ) ; • substringEMthod.invoke( “abcdefg”, 2, new Integer(5) ) > > cde

  24. Obtendo membros não públicos de uma classe • Todos as chamadas getXXX() métodos da classe Class mencionados retorna apenas membros public da classe alvo. • Para obter também membros privados, protegidos, estático existem chamadas do tipo getDeclaredXXX() • getDeclaredConstructors(), getDeclaredConstrucor(Class…) • getDeclaredFields(), getDeclaredField(String) • getDeclaredmethods(), getDeclaredMethod(String, Class…)

  25. Mais informações • Documentação http://download.oracle.com/javase/7/docs/technotes/guides/lang/index.html • Exemplos de códigos http://java.sun.com/developer/codesamples/refl.html

More Related