Criando um Class para representar um array

Olá Pessoal!

Eu preciso, em um framework que estou fazendo, ler o nome de um método e sua lista de parâmetros de um arquivo, para poder invoca-lo.

Estou com problemas pois não sei como criar uma instância de Class que representa um array de um tipo objetos para localizar o método que o utiliza como parâmetro.

Eu achei muita coisa falando sobre como criar arrays utilizando reflexão, mas como eu crio uma instância de Class representando um array de um determinado tipo?

Alguma ajuda???

[]s

isso ajuda?

http://www.devx.com/tips/Tip/12715

Seria algo assim?

Class x = String[].class;

Ou você precisa de algo ainda mais dinâmico que isso?

ja tentei fazer algo parecido e quebrei tanto a cabeça… que acabei desistindo da coisa…

[quote=ViniGodoy]Seria algo assim?

Class x = String[].class;

Ou você precisa de algo ainda mais dinâmico que isso?[/quote]

Isso não adianta, pois eu precisaria ter a definição da classe do array em uma string

[quote=peczenyj]isso ajuda?

http://www.devx.com/tips/Tip/12715[/quote]

Infelizmente não, pois esse link (e todos os outros que encontrei) falam sobre como manipular e criar um array, mas não como obter a sua classe.

Obrigado a todos! Mas se alguém tiver mais alguma idéia, será bem vinda!!!

[quote=Guerr@]Olá Pessoal!

Eu preciso, em um framework que estou fazendo, ler o nome de um método e sua lista de parâmetros de um arquivo, para poder invoca-lo.

Estou com problemas pois não sei como criar uma instância de Class que representa um array de um tipo objetos para localizar o método que o utiliza como parâmetro.

Eu achei muita coisa falando sobre como criar arrays utilizando reflexão, mas como eu crio uma instância de Class representando um array de um determinado tipo?
[/quote]

Você não cria. Por exemplo o java.lang.reflect.Array.newInstance(Class<?> componentType, int… dimensions)
cria um array do tipo componentType e retorna um objecto (que é uma array). Só que a classe desse objecto não tem nenhuma informação de componentType.

Object object  = java.lang.reflect.Array.newInstance(Class&lt;?&gt; componentType, int... dimensions);

assertFalse(object.getClass().equals(componentType));

É que eu não estou querendo criar um array, mas estou querendo o objeto Class que o representa para poder comparar com os argumentos de um método que recebe um array como parâmetro. Exemplo:

String.class; // Obtém a classe
Class.forName("java.lang.String"); //Obtém a classe

String[].class // Obtém a classe do array
Class.forName("java.lang.String[]"); // Dá pau!!!
Class.forName("[Ljava.lang.String"); // Dá pau!!!

Eu queria obter o mesmo resultado de String[].class mas sem conhecer a classe em tempo de compilação, ou seja, através de uma String…

Olá Sergio!

Minha situação é a seguinte: eu leio de um arquivo de configurações o método e os tipos de seus parâmetros, para eu dar um “getMethod()” na classe. O problema é que se o tipo for um array eu não sei como criar uma instância de Class para representa-lo.

É um problema bem específico… Entenderam melhor?

[]s

[code]import java.lang.reflect.Array;
import java.lang.reflect.Method;

public class TesteMain {

public static void main(String[] args) {
	TesteMain testeMain = new TesteMain();
	testeMain.teste();
}

public void teste() {
	try {
		Class<?> stringArrayClass = Array.newInstance(String.class, 0)
				.getClass();
		Method method = getClass().getMethod("metodoInvocado",
				stringArrayClass);
		Object args = Array.newInstance(String.class, 10);
		Array.set(args, 1, "Isto é um teste");
		method.invoke(this, args);

	} catch (Exception e) {
		e.printStackTrace();
	}

}

public void metodoInvocado(String[] teste) {
	System.out.println(teste[1]);
}

}[/code]

Dessa forma você consegue invocar um metódo que tem um array como parametro.
Espero ter ajudado.

Valeu,


Alysson Bandeira

[quote=acopiara][code]import java.lang.reflect.Array;
import java.lang.reflect.Method;

public class TesteMain {

public static void main(String[] args) {
	TesteMain testeMain = new TesteMain();
	testeMain.teste();
}

public void teste() {
	try {
		Class<?> stringArrayClass = Array.newInstance(String.class, 0)
				.getClass();
		Method method = getClass().getMethod("metodoInvocado",
				stringArrayClass);
		Object args = Array.newInstance(String.class, 10);
		Array.set(args, 1, "Isto é um teste");
		method.invoke(this, args);

	} catch (Exception e) {
		e.printStackTrace();
	}

}

public void metodoInvocado(String[] teste) {
	System.out.println(teste[1]);
}

}[/code]

Dessa forma você consegue invocar um metódo que tem um array como parametro.
Espero ter ajudado.

Valeu,


Alysson Bandeira[/quote]

Valeu Alysson!!! Foi uma solução bem criativa e funcionou para o que eu precisava!!!

Alysson tu podia descrever o que cada uma das strings significa, bem como seu comandos…
ex.
public class TesteMain { //declara uma nova classe. :shock: