Primeiro analise as três funções no modelo de proxy dinâmico:
1. Função abstrata: No proxy estático pode ser uma classe abstrata, mas no proxy dinâmico só pode ser uma interface
2. Função real: apenas implementa os métodos na função abstrata.
3. Papel do agente: O mais nojento é o papel do agente no agente dinâmico. Deve conter uma referência ao personagem real.
Envolve uma interface e uma classe, a interface InvocationHandler e a classe Proxy. De acordo com a documentação do JDK, a interface InvocationHandler é implementada por uma classe, e uma instância desta classe é o objeto manipulador correspondente a um objeto proxy. Quando um método do objeto proxy é chamado, o método será codificado e atribuído ao método de invocação de seu objeto manipulador correspondente para chamar!
Copie o código do código da seguinte forma:
//Função abstrata:
interface pública AbstractRole
{
show de vazio público();
}
//Personagem real:
classe pública RealRole implementa AbstractRole
{
@Substituir
public void show(){ System.out.println("mostre-me sua casa");
}
//Função do agente:
//Acho que isso é apenas um pseudo-agente. Eu mesmo criei o pseudo-agente = =! , porque na verdade é o manipulador correspondente ao agente
A classe pública Handler implementa InvocationHandler
{
private Object realRole; // A função proxy precisa ter uma referência à função real. Se for definida como tipo de objeto, ela é universal.
manipulador público (objeto realRole)
{ this.realRole = realRole };
@Substituir
invocação de objeto público (proxy de objeto, método de método, objeto [] args)
{
System.out.println("Dê-me seu dinheiro"); // Esta é uma função adicional adicionada pela própria função de agente.
method.invoke(this.realRole, args); //Invoca o método do papel real através da reflexão
System.out.println("Ok...a casa é sua");//Esta é uma função adicional adicionada pela própria função do agente.
}
public Object factory() //Gera a função do agente real através do método de fábrica
{
return Proxy.newProxyInstance(this.getClass().getClassLoader(), this.realObject.getClass().getInterfaces(), this); //O método newProxyInstance no Proxy possui dois recursos muito importantes! A primeira é criar dinamicamente uma classe proxy, se a saída parecer ser uma classe chamada $Proxy0; a segunda é gerar uma instância por meio da classe criada dinamicamente.
}
}
//Cliente:
Teste de classe pública
{
público estático void principal(String[] args)
{
RealRole realRole = new RealRole();//Qual papel real você deseja representar, basta criar um novo papel real
Handler handler = new Handler(realRole);//O manipulador correspondente à classe proxy é gerado aqui. Também quero chamá-lo de objeto pseudo-proxy.
AbstractRole proxy = (AbstractRole)handler.factory();//Gerar objetos proxy através de métodos de fábrica
}
}
Você pode estar se perguntando como a função de agente aqui pode ser convertida à força em uma função abstrata? A razão está no método newProxyInstance. Este método é muito interessante. Conforme mencionado acima, ele gerará automaticamente uma classe e, em seguida, gerará um objeto proxy por meio da classe. Na verdade, esta classe implementa a classe de função abstrata Por quê? Porque o segundo parâmetro já especificou quais interfaces ele implementa. Assim, você pode forçar a transferência. Após a transferência forçada, você pode chamar os métodos na função abstrata.
proxy.show();//Ok! Preste atenção a esta frase. Marquei-a em vermelho no início: "Este método será codificado e atribuído ao método de invocação de seu objeto manipulador correspondente a ser chamado, por causa desta frase, proxy.show() O método show é!" passado para o método de invocação no objeto manipulador. É claro que os parâmetros do método show também são seguidos, mas o método show aqui não tem parâmetros. Portanto, a frase proxy.show() na verdade chama o método invocar no objeto manipulador.