Problemas com java.beans.*

1 resposta
Rafael_Afonso

Olá:

Estava vendo algumas classes do pacote java.beans.*, mais especificamente as Classes Expression e Statement. Nesta Página do Java Almanac mostra como usar os métodos getters e setters através das classes acima citadas.
Assim, criei uma classe de teste. Nesta classe tento usar os métodos getters e setters de uma classe interna, de uma classe externa mas no mesmo arquivo java da classe de teste e uma classe externa de outro arquivo java.
Segue-se o código fonte da classe de teste:

import java.beans.Statement;
import java.beans.Expression;

public class TestaStatement{
    private static final String STR_SET = "setValue";
    private static final String STR_GET = "getValue";

    private void executeSetter(Object obj, String strOrigin) throws Exception {
        Statement stmt =
            new Statement(obj, STR_SET, new Object[] {new Integer(1)});
        stmt.execute();
        System.out.println("executeSetter from " + strOrigin + " complete!");
    }

    private void executeGetter(Object obj, String strOrigin) throws Exception {
        Expression expr = new Expression(obj, STR_GET, new Object[0]);
        expr.execute();
        System.out.println("executeSetter from " + strOrigin +
            " complete! Value=" + expr.getValue());
    }

    public void testInnerClass() {
        InnerClass inner = new InnerClass();

        try {
            this.executeSetter(inner, "testInnerClass()");
        } catch(Exception e) {
            e.printStackTrace();
        }

        try {
            this.executeGetter(inner, "testInnerClass()");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public void testOuterClass() {
        OuterClass outer = new OuterClass();

        try {
            this.executeSetter(outer, "testOuterClass()");
        } catch(Exception e) {
            e.printStackTrace();
        }

        try {
            this.executeGetter(outer, "testOuterClass()");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public void testExternClass() {
        ExternClass extern = new ExternClass();

        try {
            this.executeSetter(extern, "testExternClass()");
        } catch(Exception e) {
            e.printStackTrace();
        }

        try {
            this.executeGetter(extern, "testExternClass()");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        TestaStatement test = new TestaStatement();
        test.testInnerClass();
        test.testOuterClass();
        test.testExternClass();
    }

    private class InnerClass {
        int value;

        public int getValue() {
            return this.value;
        }

        public void setValue(int value) {
            this.value = value;
        }
    }
}

class OuterClass {
    int value;

    public int getValue() {
        return this.value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}

Agora o código da clase externa:

class ExternClass {
    int value;

    public int getValue() {
        return this.value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}

Pois bem, fui rodar o teste e olhem só o que obtive:

O que não entendi foi por que as classes são chamadas de “TestaStatement$InnerClass0”, “OuterClass0” e “ExternClass0”. Qual seria o motivo disso? Será que fiz alguma coisa de errado no meu código? O que vocês acham?

Grato,

1 Resposta

Rafael_Afonso

Esta questão foi resolvida neste thread no Java Ranch. Basicamente deveria transformar as classes subbetidas a Statement/Expression em públicas. Ou seja, deveria ter feito public class InnerClass, public class OuterClass, public class ExternClass.
Entretanto como cada arquivo *.java admite apenas uma classe pública, então deveria exportar OuterClass para um arquivo à parte. Ora, mas isso é exatamente a proposta do ExternClass. Logo isso não daria certo com OuterClass do jeito como está.

Grato,

Criado 3 de agosto de 2003
Ultima resposta 17 de ago. de 2003
Respostas 1
Participantes 1