[RESOLVIDO] Instanciação de classe dinamicamente

4 respostas
M

Caros amigos,

Estou com um problema, preciso ler um XML onde cada TAG simboliza uma classe, exemplo:

<Game>
	<FormaEstatica x="200" y="200" width="400" height="50" />
	<CuboVermelho x="250" y="100" />
	<CuboVerde x="250" y="50" />
	<CuboVermelhoNotClickable x="300" y="50" />
	<CuboAzul x="350" y="50" />
</Game>

Neste caso: FormaEstatica / CuboVermelho / CuboVerde / CuboVermelhoNotClickable / CuboAzul seriam todas classes

Eu consigo parsear o XML tranquilamente, mas como eu faria para utilizar a String do TagName para instanciar a classe com os parametros adequados?

Exemplo:
“CuboVerde” obj = new “CuboVerde”(250, 50);

PS: gostaria de fazer isso de forma dinamica e não atraves de um switch

4 Respostas

L

Acho que vc quer algo mais ou menos assim:

package xyz;

class Forma {
  private int x;
  private int y;
  public Forma(int x, int y)...
  get/set...
}

class CuboVerde extends Forma {
  public CuboVerde(int x, int y) {
    super(x, y);
  }
}

// Criando
void test() {
  String forma = "CuboVerde"; // Aqui vem do XML
  int x = 1; // Aqui vem do XML
  int y = 1; // Aqui vem do XML
  Class clazz = Class.forName("xyz." + forma); // xyz.CuboVerde
  Constructor constructor = clazz.getConstructor(new Class[]{Integer.class, Integer.class});
  Forma formaObj = constructor.newInstance(new Object[]{x, y});
}

Editei todo aqui, então deve ter uns erros de compilação que devem ser ajustados, mas a ideia é essa.

gqferreira

Usufruindo da orientação à objetos... polimorfismo.
Você precisará de duas bibliotecas que estou postando. Qualquer coisa dá um berro, vou estar aqui quase a tarde toda...

package br.com.gqferreira.exemplosGuj;

public abstract class FiguraGeometrica {
	
	private int x;
	private int y;
	private int width;
	private int height;
	
	public FiguraGeometrica(int x, int y, int width, int height) {
		this.x = x;
		this.y = y;
		this.width = width;
		this.height = height;
	}
	public FiguraGeometrica(int x, int y) {
		this.x = x;
		this.y = y;
	}
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	public int getWidth() {
		return width;
	}
	public void setWidth(int width) {
		this.width = width;
	}
	public int getHeight() {
		return height;
	}
	public void setHeight(int height) {
		this.height = height;
	}	
}
package br.com.gqferreira.exemplosGuj;

public class CuboVerde extends FiguraGeometrica{

	public CuboVerde(int x, int y) {
		super(x, y);
		System.out.println("Voce acabou de criar um cubo verde");
	}

}
package br.com.gqferreira.exemplosGuj;

public class FormaEstatica extends FiguraGeometrica{

	public FormaEstatica(int x, int y, int width, int height) {
		super(x, y, width, height);
		System.out.println("Voce acabou de criar uma forma estatica");
	}
}
package br.com.gqferreira.exemplosGuj;

import java.util.List;

public class Game {
	
	private List<FiguraGeometrica> figuras;

	public Game(List<FiguraGeometrica> figuras) {
		super();
		this.figuras = figuras;
	}

	public List<FiguraGeometrica> getFiguras() {
		return figuras;
	}

	public void setFiguras(List<FiguraGeometrica> figuras) {
		this.figuras = figuras;
	}
	
}
package br.com.gqferreira.exemplosGuj;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

import com.thoughtworks.xstream.XStream;

public class InstanciarClassePeloNome {

	public static void main(String[] args) throws FileNotFoundException {
		/**
		 * Instancio a biblioteca que ira fazer o parser xml<>object
		 */
		XStream xStream = new XStream();
		/**
		 * Para mapear as classes e nao precisar colocar na tag algo como: <br.com.gqferreira.exemplosGuj.CuboVerde>
		 */
		xStream.alias("FormaEstatica", FormaEstatica.class);
		xStream.alias("CuboVerde", CuboVerde.class);
		xStream.alias("Game", Game.class);

		/**
		 * Crio uma lista de figuras
		 */
		List<FiguraGeometrica> figuras = new ArrayList<FiguraGeometrica>();
		/**
		 *Adiciono duas figuras
		 */
		figuras.add(new FormaEstatica(10, 10, 500, 500));
		figuras.add(new CuboVerde(10, 10));
		/**
		 * Coloco as figuras dentro de 'game'
		 */
		Game game = new Game(figuras);

		/**
		 * Faco o 'game' virar um xml
		 */
		xStream.toXML(game, new FileOutputStream(new File("/home/gustavo/Game.xml")));

		/**
		 * O contrario, faco o xml virar o 'game'
		 */
		Game novoGame = (Game) xStream.fromXML(new FileReader(new File("/home/gustavo/Game.xml")));

		/**
		 * Mostro algumas informacoes do conteudo de 'game'
		 */
		System.out.println("Qual a segunda figura do 'game'?:");
		System.out.println(novoGame.getFiguras().get(1).getClass());

		System.out.println("Qual o 'x' dessa figura?: ");
		System.out.println(novoGame.getFiguras().get(1).getX());
	}
}
M

Muito obrigado aos dois pela ajuda

acabei optando pela opção do lsjunior pelo fato de não precisar de bibliotecas a mais, já que estou mechendo com Android tento economizar um pouco mais nos recursos
:smiley:

só tive que mudar de Integer.class para Float.TYPE
do resto foi tranquilo.

obrigado novamente pelos codigos
:smiley:

gqferreira

Mustang89:
Muito obrigado aos dois pela ajuda

acabei optando pela opção do lsjunior pelo fato de não precisar de bibliotecas a mais, já que estou mechendo com Android tento economizar um pouco mais nos recursos
:smiley:

só tive que mudar de Integer.class para Float.TYPE
do resto foi tranquilo.

obrigado novamente pelos codigos
:D

Hum… legal que tenha conseguido, poderia ter dito que era para Android… :wink:

Criado 23 de outubro de 2011
Ultima resposta 23 de out. de 2011
Respostas 4
Participantes 3