Access Violation

quinta-feira, janeiro 20, 2005

Metadados II


No último post apresentei brevemente o conceito de "metadados" que, quando aplicados à programas, acrescentam informações, que normalmente não são incluídas, ao binário gerado pelo compilador, tais como lista de tipos contidos no módulo, métodos, eventos, etc.

Este post contém um exemplo de como podemos explorar estes metadados em um programa em java.









1 import java.lang.reflect.*;
2
3 public class TestReflection
4 {
5 public static void main(String []args)
6 {
7 if (args.length == 1)
8 {
9 TestReflection tr = new TestReflection();
10 tr.DumpMethods(args[0]);
11 }
12 else
13 {
14 System.out.println("Numero invalido de parametros");
15 System.out.println("Uso: java TestReflection 'classe'\r\n");
16 System.out.println("Ex: java TestReflection java.lang.String");
17 }
18 }
19
20 private void DumpMethods(String className)
21 {
22 try
23 {
24 Class cls = Class.forName(className);
25 Method m[] = cls.getDeclaredMethods();
26
27 for (int i=0; i < m.length; i++)
28 {
29 DumpMethod(m[i]);
30 }
31 }
32 catch(ClassNotFoundException cnfe)
33 {
34 System.out.println("Classe '" + className + "' nao foi encontrada!");
35 }
36 }
37
38 private void DumpMethod(Method m)
39 {
40 System.out.print(Modifier.toString(m.getModifiers()) + " " + m.getReturnType().getName() + " " + m.getName() + "(");
41
42 Class paramTypes[] = m.getParameterTypes();
43 for (int i=0; i < paramTypes.length - 1; i++)
44 {
45 System.out.print(paramTypes[i].getName() + ", ");
46 }
47
48 if (paramTypes.length > 0)
49 {
50 System.out.print(paramTypes[paramTypes.length - 1].getName());
51 }
52
53 System.out.println(")");
54 }
55 }
56

Toda a mágica é ocorre nos métodos DumpMethods() (linhas 20 - 36) e DumpMethod() (linhas 38 - 54).

Na linha 24, o método estático forName() da classe Class é utilizado para recuperar uma referência para o objeto Class que representa a classe passada como parâmetro. A seguir (linha 25) o método getDeclaredMethods() deste objeto é utilizado para recuperar a lista de métodos implementados pela classe. O próximo passo é chamar o método DumpMethod() (linhas 27 - 29) para cara objeto da lista obtida no passo anterior. Este método por sua vez utiliza os métodos da classe Method (que modela um método de um objeto) para obter informações sobre o nome do método, lista de parâmetros, modificadores, etc.

Nos próximos posts apresentarei um exemplo em .Net e também como "estender" o mecanismo de metadados adicionando seus próprios "atributos" mas isto é assunto para os próximos posts.

[+/-] mostrar/esconder este post