Reflection

Caro amigos estou tentando pegar os fields da interface de uma classe, pois tenho declarado na interface constrantes e gostaria de pegar o nome e o valor …

Obrigado

Qual a dificuldade? Pegar o valor de fields estáticos? Se sim, basta omitir o segundo parâmetro do método get:

public interface Test {
    public static final String VALUE = "test";
}

public static void main( String[] bananinha ) throws Exception {
    Class klass = Test.class;
    Field field = klass.getField( "VALUE" );
    String value = ( String ) field.get( null );
    String fieldName = field.getName();
}

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/Field.html#get(java.lang.Object)
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/Field.html#getName()

Se quer pegar um array de objetos Field da interface, basta

Field[] fields = klass.getFields();

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#getFields()

import java.lang.reflect.*;

interface FacaOQueEuDigoNaoFacaOQueEuFaco {
    public static final int VALOR1 = -1;
    public static final String VALOR2 = "Alô alô marciano \n!";
}

class TesteListaInterface {
    public static String quoteString(String unquoted) {
        StringBuffer ret = new StringBuffer();
        ret.append ("\'");
        for (int i = 0; i < unquoted.length(); ++i) {
            char ch = unquoted.charAt(i);
            switch (ch) {
            case '\t':
                ret.append ("\\t"); 
                break;
            case '\b':
                ret.append ("\\b"); 
                break;
            case '\f':
                ret.append ("\\f"); 
                break;
            case '\n':
                ret.append ("\\n"); 
                break;
            case '\r':
                ret.append ("\\r"); 
                break;
            default:
                if (' ' <= ch && ch <= 126) {
                    ret.append (ch);
                } else {
                    ret.append ("\\u" + Integer.toHexString ((ch & 0xFFFF) | 0x10000).substring(1).toUpperCase());
                }
            }
        }
        ret.append ("\'");
        return ret.toString();
    }
    
    public static void main(String[] args) throws Exception {
        Class cl = FacaOQueEuDigoNaoFacaOQueEuFaco.class; // só para simplificar um pouco a demonstração
        Field[] fields = cl.getDeclaredFields();
        for (int i = 0; i < fields.length; ++i) {
            Field f = fields[i];
            if (Modifier.isStatic (f.getModifiers())) { // todos os campos são estáticos, só estou sendo "cri-cri"
                System.out.print ("public static final ");
                Class clF = f.getType();
                if (clF.equals (int.class)) {
                    System.out.println ("int " + f.getName() + " = " + f.getInt(null));
                } else if (clF.equals (char.class)) {
                    System.out.println ("char " + f.getName() + " = (char)" + (int) f.getChar(null));
                } else if (clF.equals (short.class)) {
                    System.out.println ("short " + f.getName() + " = (short)" + f.getShort(null));
                } else if (clF.equals (long.class)) {
                    System.out.println ("long " + f.getName() + " = " + f.getLong(null) + "L");
                } else if (clF.equals (float.class)) {
                    System.out.println ("float " + f.getName() + " = " + f.getFloat(null) + "f");
                } else if (clF.equals (double.class)) {
                    System.out.println ("double " + f.getName() + " = " + f.getDouble(null));
                } else if (clF.equals (String.class)) {
                    System.out.println ("String " + f.getName() + " = " + quoteString ((String)f.get(null)));
                } else {
                    System.out.println (f.getType() + " " + f.getName() + " = ...;");
                }                  
            }
        }
    }
}

Deve imprimir:

public static final int VALOR1 = -1
public static final String VALOR2 = 'Al\u00F4 al\u00F4 marciano \n!'

Dei uma olhada em casa exemplo acima e consegui fazer o que eu desejava… muito obrigado pelas dicas…