Muitas estruturas convencionais usam tecnologia de reflexão. Por exemplo, a estrutura ssh usa duas tecnologias: xml como arquivo de configuração + tecnologia de reflexão.
Pacotes de aulas relacionados à reflexão.
java.lang.reflect.* e java.lang.Class;
Todos os tipos em Java (incluindo tipos básicos) correspondem a um objeto Class, e esta classe é java.lang.Class. Ou seja, cada tipo possui um objeto Class correspondente em Class. Observe que não é que não haja acesso público.
Como obter o objeto Class
Copie o código do código da seguinte forma:
.Para cada object.getCalss(), você pode obter a classe correspondente.
.Class.forName (String), o método de escrita de String: nome do pacote.nome da classe.O objeto correspondente ao nome do pacote.nome da classe será criado. Nota: 1.2 se aplica apenas a tipos de referência.
.Para tipos básicos: a classe de encapsulamento TYPE representa o objeto Class do tipo básico correspondente.TYPE corresponde ao objeto Class de int.
.Tipo, Classe. <Tipo 4 é universal.>
Dos quatro métodos acima, apenas o método 2 é dinâmico. Basta alterar um pacote. Portanto, se você deseja realmente incorporar a programação dinâmica, você só pode usar o método 2.
Existe apenas um objeto Class de cada tipo, ou seja, eles possuem apenas um endereço, mas tipos diferentes são diferentes.
Portanto, os seguintes resultados de impressão são todos verdadeiros.
Copie o código do código da seguinte forma:
//Pares e tipos de referência
Classe c1 = "".getClass();
Classe c2 = Class.forName("java.lang.String");
Classe c3 = String.class;
System.out.println(c1 ==c2);//true
//Para tipos básicos
Classe num1 = Inteiro.TYPE;
Classe num2 = int.class;
System.out.println(num1 == num2); //true
Reflexão para obter métodos relacionados de membros em uma classe
[Obter estrutura <de acordo com o tipo de parâmetro>] (geralmente usado sem declaração)
Copie o código do código da seguinte forma:
Construtor<T> getConstructor(Class<?>... parâmetroTypes)
Retorna um objeto Construtor que reflete o construtor público especificado da classe representada por este objeto Classe.
Construtor<?>[] getConstructors()
Retorna uma matriz contendo objetos Construtor que refletem todos os construtores públicos da classe representada por este objeto Classe.
Construtor<T> getDeclaredConstructor(Class<?>... parâmetroTypes)
Retorna um objeto Construtor que reflete o método construtor especificado para a classe ou interface representada por este objeto Classe.
Construtor<?>[] getDeclaredConstructors()
Retorna uma matriz de objetos Construtores que refletem todos os métodos construtores declarados pela classe representada por este objeto Classe.
[Obter atributo <de acordo com o nome do atributo>] (geralmente usado com declarado, porque os atributos geralmente são privados)
Copie o código do código da seguinte forma:
Campo getField(Nome da string)
Retorna um objeto Field que reflete os campos de membros públicos especificados da classe ou interface representada por este objeto Class.
Campo[] getFields()
Retorna uma matriz contendo objetos Field que refletem todos os campos públicos acessíveis da classe ou interface representada por este objeto Class.
Campo getDeclaredField(nome da string)
Retorna um objeto Field que reflete o campo declarado especificado da classe ou interface representada por este objeto Class.
Campo[] getDeclaredFields()
Retorna uma matriz de objetos Field que refletem todos os campos declarados pela classe ou interface representada por este objeto Class.
[Obtendo método <nome do método mais tipo de parâmetro>] (geralmente usado sem declaração)
Copie o código do código da seguinte forma:
Método getMethod(Nome da string, Classe<?>...parametroTypes)
Retorna um objeto Method que reflete o método de membro público especificado da classe ou interface representada por este objeto Class.
Método[] getMethods()
Retorna uma matriz contendo objetos Method que refletem os membros públicos da classe ou interface representada por este objeto Class (incluindo aqueles declarados por essa classe ou interface e aqueles herdados de superclasses e superinterfaces).
Método getDeclaredMethod(Nome da string, Classe<?>...parametroTypes)
Retorna um objeto Method que reflete o método declarado especificado da classe ou interface representada por este objeto Class.
Método[] getDeclaredMethods()
Retorna uma matriz de objetos Method que refletem todos os métodos declarados pela classe ou interface representada por este objeto Class, incluindo métodos públicos, protegidos, acesso padrão (pacote) e privados, mas excluindo métodos herdados.
T novaInstância()
Cria uma nova instância da classe representada por este objeto Class. <new Instance() pode criar objetos dinamicamente>
String paraString()
Converta objeto em string.
Perceber: newInstance() chama um construtor sem parâmetros. Se a classe não tiver um construtor sem parâmetros, newInstance() irá gerar uma exceção.
Os métodos declarados suportam a privacidade, mas não suportam a herança. Os métodos não declarados suportam a herança, mas não suportam a privacidade e só podem retirar coisas públicas.
Portanto, as propriedades são geralmente declaradas com declaração, porque as propriedades são geralmente privadas, os métodos geralmente são obtidos sem declaração e os construtores são geralmente obtidos sem declaração.
A reflexão de simulação de instância obtém propriedades e métodos relevantes na classe
Usando reflexão para atribuir valores às propriedades
Métodos em campo
Obtenção de objeto(Objeto obj)
Retorna o valor do campo representado por este Field no objeto especificado.
Campo f = c.getXXField(nome da propriedade);
valor = f.get(objeto);
conjunto vazio (objeto obj, valor do objeto)
Define o campo representado por este objeto Field na variável de objeto especificada para o novo valor especificado.
f.set(objeto, valor);
Classe<?> getType()
Retorna um objeto Class que identifica o tipo declarado do campo representado por este objeto Field.
Usado para obter o tipo de atributo (retorna o objeto Class).
Copie o código do código da seguinte forma:
Turma c = Aluno.turma;
Object obj = c.newInstance(); //Cria um objeto da classe Student
Campo f = c.getDeclaredField("nome"); //Obtém o atributo nome
f.setAccessible(true); //Definir acesso privado.
f.set(obj, "zhangsan");
System.out.println(f.get(obj)); //Obtém o valor do atributo name do obj.
Usando reflexão para chamar construções A chamada real para o construtor ocorre quando o método newInstance() é chamado.
Copie o código do código da seguinte forma:
Classe c = Class.forName("com.clazz.reflect.Student");
Construtor con = c.getConstructor(); //Nenhuma construção é executada,
Object cObj = c.getConstructor().newInstance();//Chama o construtor sem parâmetros
Construtor conAll = c.getConstructor(int.class,String.class,int.class);
Object caobj = conAll.newInstance(1001,"zjamgs",234235);//Chama o construtor com parâmetros.
System.out.println(caobj); //Imprimir saída
Chamando métodos usando reflexão Nome do objeto.Method (valor 1,2,3);
Método m = c.getMethoed(nome do método, tipo de parâmetro...);
m.invoke (objeto, parâmetros de chamada de método) Se o parâmetro formal exigido pelo método subjacente for 0, o comprimento da matriz args fornecida pode ser 0 ou nulo.
Copie o código do código da seguinte forma:
Classe c = Class.forName("com.clazz.reflect.Student");
Object obj = c.newInstance(); //Cria um objeto Sutdent.
Método msetName = c.getMethod("setName", String.class);//obj não precisa converter o tipo
msetName.invoke(obj, "zhangsan");//Chama o método setName e passa os parâmetros.
Método msetId = c.getMethod("setId", int.class);
msetId.invoke(obj, 409090202);
System.out.println(obj);
Exemplos de aplicação de reflexão Classe de entidade
Copie o código do código da seguinte forma:
pacoteorg.dennisit.reflect.entity;
importar java.io.Serializable;
/**
*
*Usuário.java
*
* @versão: 1.1
*
* @autor: Su Ruonian<a href="mailto:
[email protected]">Enviar e-mail</a>
*
* @desde: 1.0 Tempo de criação: 26/02/2013 13:43:56
*
* TODO: a classe User.java é usada para ...
*
*/
classe pública O usuário implementa Serializable{
teste de string privado;
public void execute(String nome,int idade){
System.out.println("nome=" + nome + ",idade=" + idade);
}
}
Aula de teste de reflexão
Copie o código do código da seguinte forma:
pacoteorg.dennisit.reflect.main;
importar java.lang.reflect.Field;
/**
*
* RefletEx.java
*
* @versão: 1.1
*
* @autor: Su Ruonian<a href="mailto:
[email protected]">Enviar e-mail</a>
*
* @desde: 1.0 Tempo de criação: 26/02/2013 13:46:00
*
* TODO: a classe ReflectEx.java é usada para ...
*
*/
classe pública ReflectEx {
public static void main(String[] args)lança exceção {
Classe cls = Class.forName("org.dennisit.reflect.entity.User");
Object obj = cls.newInstance();
Campo f = cls.getDeclaredField("test"); //Obter o atributo de teste
f.setAccessible(true); //Abrir permissões de acesso para teste de atributo privado
f.set(obj, "zhangsan"); //Copiar novamente para teste
System.out.println(f.get(obj)); //Obter o valor do atributo de teste de obj
//Obtém o método baseado no nome do método execute
java.lang.reflect.Method m = cls.getMethod("executar", String.class, int.class);
m.invoke(obj, "dennisit",23); //Chama o método de execução
}
}
Efeito de operação
Copie o código do código da seguinte forma:
Zhangsan
nome=dennisit,idade=23
Exemplo de escrita de uma classe de instanciação dinâmica reflexiva
Copie o código do código da seguinte forma:
pacoteorg.dennisit.reflect.main;
importar java.lang.reflect.Field;
importar java.lang.reflect.Method;
importar java.util.Map;
importar java.util.Set;
/**
*
* DynamicReflect.java
*
* @versão: 1.1
*
* @autor: Su Ruonian<a href="mailto:
[email protected]">Enviar e-mail</a>
*
* @desde: 1.0 Horário de criação: 26/02/2013 13:58:12
*
* TODO: Exemplo de instanciação dinâmica usando reflexão
*
*/
classe pública DynamicReflect {
public static Object getInstance(String className,Map<String,Object> mapa)lança Exception{
Classe c = Class.forName(className);
Objeto obj = c.newInstance();
Set<String> keys = map.keySet(); //Obter todos os atributos correspondentes
Field[] fAll = c.getDeclaredFields();
for(int i=0;i<fAll.length;i++){
for(String key:keys){ //Correspondência de loop
if(fAll[i].getName().equals(key)){ //Se o atributo passado pelo usuário corresponde ao nome do atributo na classe obtida
Campo f = c.getDeclaredField(key);//Obtém este atributo
//Constrói o nome do método setXxx()
String nomedométodo = "set" + key.substring(0,1).toUpperCase()+key.substring(1);
Method method = c.getMethod(methodName, f.getType());//Obtém o método correspondente com base no nome de usuário construído
method.invoke(obj, map.get(key));//chamada de método
}outro{
continuar;
}
}
}
retornar objeto;
}
}
Em seguida, testamos o exemplo de instanciação de reflexão dinâmica que escrevemos
Classe de entidade
Copie o código do código da seguinte forma:
pacoteorg.dennisit.reflect.entity;
importar java.io.Serializable;
/**
*
*Usuário.java
*
* @versão: 1.1
*
* @autor: Su Ruonian<a href="mailto:
[email protected]">Enviar e-mail</a>
*
* @desde: 1.0 Tempo de criação: 26/02/2013 13:43:56
*
* TODO: Classe de entidade
*
*/
classe pública O usuário implementa Serializable{
nome da string privada;
idade interna privada;
email de string privado;
public User() { //Não deve ter construtor de parâmetro
}
//getter() e setter()
}
Classe de teste principal
Copie o código do código da seguinte forma:
pacoteorg.dennisit.reflect.main;
importar java.util.HashMap;
importar java.util.Map;
importar org.dennisit.reflect.entity.User;
/**
*
* RefletEx.java
*
* @versão: 1.1
*
* @autor: Su Ruonian<a href="mailto:
[email protected]">Enviar e-mail</a>
*
* @desde: 1.0 Tempo de criação: 26/02/2013 13:46:00
*
* TODO: a classe ReflectEx.java é usada para ...
*
*/
classe pública ReflectEx {
public static void main(String[] args)lança exceção {
Classe cls = Class.forName("org.dennisit.reflect.entity.User");
String className = "org.dennisit.reflect.entity.User";
Map<String,Object> map = new HashMap<String, Object>();
map.put("nome", "dennisit");
map.put("idade", 22);
map.put("email", "[email protected]");
Usuário usuário = (Usuário)DynamicReflect.getInstance(className, mapa);
System.out.println(user.getName() + "," + user.getAge() + "," + user.getEmail());
}
}
Resultados da execução do programa
Copie o código do código da seguinte forma: