Ola pessoal, tem uma coisa que me deixou com duvida aqui, imagina que eu tenho um EJB com um método que recebe como parâmetro um objeto Foo:
public class Foo implements Serializable {
private static final long serialVersionUID = 6250275667653681615L;
private int atributo;
public int getAtributo() {
return atributo;
}
public void setAtributo(int atributo) {
this.atributo = atributo;
}
}
Ai alguem que vai usar meu EJB, criou uma classe que extende Foo e sobrescreve getAtributo:
public class Foo2 extends Foo {
private static final long serialVersionUID = -2724238215363246468L;
@Override
public int getAtributo() {
System.out.println("teste");
return 1;
}
}
ai vamos supor que o método do meu EJB execute o getAtributo do objeto foo que vem, como foi um Foo2 ele vai executar o getAtributo imprimindo ‘teste’ e retornando 1… então, só que agora vamos supor que meu servidor de aplicação tá rodando na minha maquina, como um serviço, e o cara que criou Foo2 e eu se quer conheço sabe acessar meu EJB. Sabendo que vai ser executado getAtributo, o que impede o cara de sobrescrever getAtributo fazendo coisas que não devem e isso ser executado no meu servidor?!
Da mesma forma, meu sistema le um arquivo com objetos Foo, e o cara de sacanagem grava um monte de Foo2 sobrescrevendo readObject (com um código que faz cagada) e meu sistema le…
public class Teste {
static class Foo implements Serializable {
private static final long serialVersionUID = 6250275667653681615L;
private int atributo;
public int getAtributo() {
return atributo;
}
public void setAtributo(int atributo) {
this.atributo = atributo;
}
}
static class Foo2 extends Foo {
private static final long serialVersionUID = -2724238215363246468L;
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException {
System.out.println("estou fazendo cagada");
}
}
static String FILENAME = "/home/lroos/teste1.x";
static void ler() throws IOException, ClassNotFoundException {
InputStream is = new FileInputStream(new File(FILENAME));
ObjectInputStream ois = new ObjectInputStream(is);
Foo foo = (Foo) ois.readObject();
System.out.println(foo.getAtributo());
ois.close();
is.close();
}
static void gravar() throws IOException {
Foo foo = new Foo2();
foo.setAtributo(9);
OutputStream os = new FileOutputStream(new File(FILENAME));
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(foo);
oos.close();
os.close();
}
public static void main(String[] args) throws IOException,
ClassNotFoundException {
gravar();
ler();
}
}
Qual é a solução para isso?! declarar classes de objetos que serão serializados (Foo) como final?! ou existe outra?!
valeu!