O mecanismo de reflexão Java está no estado de corrida. Um método de objeto é chamado de mecanismo de reflexão da linguagem Java. O conceito de reflexão foi proposto pela primeira vez por Smith em 1982, referindo -se principalmente a uma capacidade de que um programa possa acessar, detectar e modificar seu próprio estado ou comportamento. A proposta desse conceito provocou rapidamente pesquisas sobre refletividade aplicada no campo da ciência da computação. Foi adotado pela primeira vez no campo do design da linguagem de programação e realizou conquistas em Lisp e orientado a objetos. É claro que a reflexão em si não é um conceito novo.
O mecanismo de reflexão Java fornece principalmente os seguintes usos:
Determine a classe à qual qualquer objeto pertence ao tempo de execução
Construir objetos de qualquer aula em tempo de execução
Determine as variáveis e métodos de membro de qualquer classe em tempo de execução
Chamando métodos de qualquer objeto em tempo de execução
Primeiro, vamos dar uma olhada em um exemplo simples e usar este exemplo para entender como funciona o mecanismo de reflexão de Java.
pacote com.wanggc.reflection; importar java.lang.reflect.method;/*** Exercícios de reflexão java. * * @author wanggc * /public class fornametest { /** * função de entrada. * * @param args * parâmetros * @throws exceção * mensagem de erro */ public static void main (string [] args) lança exceção {// get class Class <?> cls = class.fornam e (args [0]); / / Obtenha o objeto correspondente através do método de classe [] Métodos = cls.getMethods ();Quando o parâmetro aprovado for java.lang.string, o seguinte resultado será emitido
public boolean java.lang.string.equals (java.lang.object) public java.lang.string java.lang.string.toString () public int java.lang.string.hashcode () pu btic int java.lang.string . int) public int java.lang.string.indexof (java.lang.string) public int java.lang.string.indexOf (java.lang.string, int) public static java.lang.string java.lang .string.valueof (int) public static java.lang.string java.lang.string.valueof (char) public static java.lang.string java.lang.string java.lang.string.valueof (boolean) estático público java.lang.st anel java.lang.string.valueof (flutuante) public static java.lang.string java.lang.string.valueof (char [], int, int) public static java.lang.string java.lang.string.valueof (duplo) public satic java.lang.string java .lang.string.valueof (char []) public static java.lang.string java.lang.string.valueof (java.lang.Object) public static java.lang.string java. Lang.String. Str ing.codePointCount (int, int) public int java.lang.string.compareToignorecase (java.lang.string) public java.lang.string java.lang.string.concat (java.lang.string) public boolean java.lang.lang.lancat (java.lang.string) boolean público .String .Contains (java.lang.Charsequence) public boolean java.lang.string.conteentequals (java.lang.charsequence) public boolean java.lang.string.ConteentEquals (java.lang.stringbuffer) Public Stati c Java.lang. String java.lang.string.copyValueof (char []) public static java.lang.string java.lang.string.copyValueof (char [], int, int) public boolean java.lang.string.endswith (java.lang. String) public boolean java.lang.string.equalsignorecase (java.lang.string) estático public static java.lang.string java.lang.string.format (java.lang.string, java.lang.object []) estático público java .Lang.String java.lang.st ring.format (java.util.locale, java.lang.string, java.lang.object []) public byte [] java.lang.string.getbytes (java.lang.string ) lança java.io.unsputtedences ímãs ímãs Void Java.lang. getBytes (java.nio.charset.char) public void java .lang.string.getchars (int, int, char [], int) public nativo java.lang.string java.lang.string.intern () public boolean java () .lang.string.isempty () public int j ava.lang. ) public int java.lan g.String.LastIndexOf (java.lang. String, int) public int java.lang.string.length () public boolean java.lang.string.matches (java.lang.string) public int java .Lang.String.OffSetByCodePoin ts (int, int) public boolean java.lang .string.regionmatches (boolean, int, java.lang.string, int, int, int) public boolean java.lang.string.regionmatches (int, int) java.lang.string, int, int) public java.lan g.string java.lang .string.replace (java.lang.charsequence, java.lang.charquence) java.lang.string java.lang.string.place.Place (char, char) public java.lang.string java .lang.string.replaceall (java .lang.string, java.lang.string) java.lang.string java.lang.string.replacefirst (java.lang.string , java.lang.string) public java.lang.string [] java.lan g.string .split (java.lang.string) java.lang.string [] java.lang.string.split (java.lang. String, int) public boolean java.lang.string.startswith (java.lang.st ring) public boolean java.lang.string.startswith (java.lang.string, int) public java.lang.charvequence java.lang.string .Subsequence (int, int) public java.lang.string j ava.lang.string.substring (int) public java.lang.string java.lang.string.substring (int, int) public char [] java.lang. String.ToCharArray () public java.lang.string java.lang.string.tolow ercase () public java. .String java.lang.string.TOUPCERCASE () public java.lang.string java.lang.string ing.TOUPPERCASE (java.util. Locale) public java.lang.string java.lang.string.trim () Nativo público final void java.lang.Object.wait (longo) lança java.lang.interruptExceptionPub lic final void java.lang.object.wait () lança java .lang.interruptedExceptionpublic vazio java.lang.object.wait (long, int) java.lang.InterruptedExceptionPublic Native Java.lang.cla ss java.lang.object.getclass () public final nativo void java.lang.object.
Isso lista todos os nomes de métodos, seus personagens limitadores, tipos de retorno e exceções da classe java.lang.string. Este programa usa o método da classe Forname para carregar a classe especificada e, em seguida, chama o método getMethods para retornar a lista de métodos da classe especificada. java.lang.reflect.method é usado para expressar um único método em uma determinada classe.
O uso do mecanismo de reflexão de Java geralmente requer três etapas:
Obtenha o objeto de classe que você deseja operar a classe através do objeto de classe obtido na primeira etapa para obter o método da classe ou o método ou atributo obtido na segunda etapa da operação do nome da classe.
Quando o Java está em execução, não importa quantos objetos uma determinada classe gerem, eles corresponderão ao mesmo objeto de classe, que representa a classe e a interface no programa em execução. Existem três maneiras comuns de obter objetos de classe da classe de operação:
Chamada Método estático da classe Forname, conforme mostrado no exemplo acima;
Use a sintaxe .class da classe, como: classe <?> Cls = string.class;
Chame o método getClass do objeto, como: string str = "abc";
O seguinte usará um exemplo para descrever como executar um determinado método de um objeto através das três etapas mencionadas acima:
pacote com.wanggc.reflection; * * @author wanggc */ public class refletiontest {public static void main (string [] args) lança exceção {display display = new Display (); Obtenha o método de show da classe de exibição através do método da classe = cls.getmethod ("show", string.class); Void Show (Nome da String) {System.out.println ("Hello:" Nome);Como mencionado anteriormente, cada classe de um programa Java terá um objeto de classe correspondente a ele. O primeiro passo na reflexão Java é obter esse objeto de classe, como 14 linhas de código. Obviamente, o método de cada classe também deve ter um objeto de método correspondente a ele. Para chamar esse método por meio da reflexão, você deve primeiro obter o objeto Método desse método, como a linha 16 do código e, em seguida, usar o objeto Método para chamar esse método por sua vez, como a linha 18 do código. Observe que o primeiro parâmetro do método getMethod na linha 16 é o nome do método e o segundo é o tipo de parâmetro desse método. Execute o método de invasão de 18 linhas de código, que é realmente o método de show O parâmetro é transparente para o método de show. O tipo e o número devem ser consistentes com o método getMethod de 16 linhas.
O exemplo acima mostra como chamar um método de uma determinada classe através da reflexão.
pacote com.wanggc.reflection; * * @author wanggc */ public classe refletionTest {public static void main (string [] args) lança exceção {// criar estudante estudante de objeto = novo aluno (); ; ) + ":" + deststudent.getStuage ()); * * @param de * copie o objeto de origem * @param dest * copie o objeto de destino * @throws exceção * exceção */ private static void copybean (objeto de, objeto dest) lança exceção {// obtenha o objeto de classe da cópia Classe de origem <?> FromClass = From.getClass (); > Destclass = Dest.getclass (); Nome do objeto de alvo de cópia Destfield = Destc lass.getDecaredfield (nome); Objeta -se ao atributo correspondente do objeto de alvo de cópia Destfield.Set (dest, de Fromfield .: ::::::::::::::::::::::heone ::::::::::::::::::::::hene ::::::::::::::::::he:::::::::::::. : ::::::::::::::::::::::Here :::::::::::::::::::hee :::::::::::::::::heo the : ::::::::::::::::::::::::here :::::::::::::::::::heone ::::::::::::::::::::he::::::::::. ; * / Classe Student { / ** Nome* / String Private String; ** Nome do aluno @return*/ public string getStuname () {return atuname; } / *** Obtenha idade do aluno** @return Student Age* / public int getStuage () {retorna stuage; ) {this.stuage = stuage;No mecanismo de lançamento do Java, a classe corresponde à classe, os métodos de classe correspondem ao método e, é claro, as propriedades também correspondem ao campo. Os comentários no código foram comentados em detalhes e não serão repetidos aqui. Mas esteja ciente de que o campo fornece métodos GET e Set para obter e definir os valores dos atributos, mas como o atributo é um tipo privado, a acessibilidade do atributo precisa ser definida como verdadeira, como as linhas 50 ~ 51 do código. Você também pode definir acessibilidade para todos os campos e usar o método estático de acessível SetAccessible SetAccessible em 40 linhas, como: acessívelBject.SetAccessible (FromFields, True);
A descrição anterior mostra como usar o mecanismo de reflexão Java para operar os métodos e propriedades de uma classe.
pacote com.wanggc.reflection; * * @author wanggc */ public classe refletionTest {public static void main (string [] args) lança exceção {// criar estudante estudante de objeto = novo aluno (); ; ());} /*** Copie as informações do objeto do aluno. * * @param de * copie o objeto de origem * @param dest * copie o objeto de destino * @throws exceção * exceção */ objeto estático privado copybean (objeto de) lança Exceção {// Obtenha o objeto Copiar o objeto da classe de objeto de origem < ?> FromClass = From.getClass (); (); SET (INTS, Fromfield.get (de)); * / Classe Student { / ** Nome* / String Private String; ** Nome do aluno @return*/ public string getStuname () {return atuname; } / *** Obtenha idade do aluno** @return Student Age* / public int getStuage () {retorna stuage; ) {this.stuage = stuage;O resultado deste exemplo e o exemplo anterior é o mesmo. No entanto, o objeto retornado pelo método copybean não é mais passado fora, mas é gerado internamente pelo método, conforme mostrado no código na linha 40. NOTA: O método NewInstance da classe pode criar apenas classes que contêm construtores sem parâmetros. wanggc ");
Nesse ponto, as funções comuns do mecanismo de reflexão Java (o método de chamar objetos em tempo de execução, o uso de atributos de classe e a criação de objetos de classe) foram introduzidos.
Suplemento: Ao obter os métodos, propriedades e construtores da classe, existem dois métodos correspondentes: getxxx e getgetDecLaredxxx. A diferença é que os primeiros métodos e propriedades retornam com os direitos de acesso, incluindo aqueles na classe dos pais;
O conteúdo acima é o mecanismo de lançamento do Java apresentado a você, espero que gostem.