Este artigo organiza pontos de conhecimento para agentes dinâmicos Java, o conteúdo específico é o seguinte
1. Proxy dinâmico Java (declaração oficial comparativa)
O modelo proxy é um modelo de design Java comumente usado. Sua característica é que a classe de proxy e a classe Delegate tenham a mesma interface. A classe de proxy é principalmente responsável por pré -processamento de mensagens, filtrar mensagens, encaminhar mensagens para a classe Delegate e processando mensagens após o evento. Geralmente, existe uma associação entre a classe proxy e a classe Delegate. O objeto de uma classe de proxy está associado ao objeto de uma classe delegada. O objeto da classe de proxy em si não implementa realmente o serviço, mas fornece serviços específicos chamando os métodos relevantes do objeto de classe Delegate.
De acordo com o período da criação do agente, as classes dos agentes podem ser divididas em dois tipos.
Proxy estático: criado por programadores ou gera automaticamente o código -fonte por ferramentas específicas e o compila. Antes da execução do programa, já existe o arquivo .class da classe proxy.
Proxy dinâmico: é criado dinamicamente usando o mecanismo de reflexão quando o programa está em execução.
2. Implementação dinâmica de proxy
java.lang.reflect.proxy,
O proxy fornece métodos estáticos para criar classes e instâncias dinâmicas de proxy.
NewProxyInstance ()
Retorna uma instância da classe proxy da interface especificada que pode atribuir chamadas de método ao manipulador de chamadas especificado.
2.1. Interface Dao (fornece interface simulada de camada de acesso a dados)
pacote javaProxy;/** Defina uma interface da camada de acesso a dados*/interface pública dao {// simular a economia de dados public void save ();} 2.2. Classe de implementação da classe Daoimpl
pacote javaProxy; classe pública Daoimpl implementa Dao {@Override public void save () {System.out.println ("Execute um método de salvamento ................"); }} 2.3. Classe de processamento de agentes
pacote javaProxy; importar java.lang.reflect.invocationHandler; importar java.lang.reflect.method; classe pública DaoHandler implementa InvocationHandler {objeto privado obj; public daoHandler (objeto obj) {this.obj = obj;} @Override public Object Invoke (proxy do objeto, método do método, objeto [] args) lança o precedente {System.out.printl ("fazer algo antes do método (] ///o prem-method de um objeto é o que é o que é o que é o que é o que é o objetivo args); System.out.println ("Faça algo depois do método"); // O post-method da AOP é simulado aqui Ret Ret; }} 2.4. Chamada de cliente
pacote javaProxy; importar java.lang.reflect.proxy; public class cliente {public static void main (string [] args) {// metaobject (objeto proxado) daoimpl daoimpl = new Daoimpl (); // Classe de proxy de negócios DaoHandler DaoHandler = new DaoHandler (DaoImpl); Dao dao = (dao) proxy.newproxyInstance (daoimpl .getclass (). Getclassloader (), daoimpl.getclass () .getInterfaces (), daoHandler); Dao.save (); }}2. 5. Resultados
3. Simule a implementação de proxy em mybatis
3.1. Classe MapperProxy
pacote javaProxy; importar java.lang.reflect.invocationHandler; importar java.lang.reflect.method; importar java.lang.reflect.proxy; classe pública maperoproxy implementa o ObjectLendler {@suPletSwarnings ("sem chiqueiro * * * * * * * * * * * * * * * *) * * * * * * * * * * * * * * * * * * * * * @Param: Execute Método com SQLSession** @return: Retorno objeto proxy*/ public static <t> t newmapperProxy (classe <T> MapperInterface, objeto sqlSession) {classLoader classLoader = MapPerInterface.getClassloader (); Classe <?> [] Interfaces = nova classe [] {mapperInterface}; Proxy mapperProxy = new MapperProxy (); return (t) proxy.newProxyInstance (Classloader, interfaces, proxy); } / * * (não javadoc) * * @See java.lang.reflect.invocationHandler#Invoke (java.lang.object, * java.lang.reflect.method, java.lang.object [] * * @param: o nome da proxy * * @param: método Finds Finds: o método Finds, o método do método, o método do método, o método do método, o método do método o método do método o método do método do método do método do método do método do método do método: o método do método: o método do método do método. Encontre o mapa de parâmetros correspondentes** @return: retornar o objeto de parâmetro executado*/ public Object Invoke (proxy do objeto, método do método, objeto [] args) lança arremesso {// aqui, a operação correspondente é realizada analisando o mapeador correspondente através do nome do método e dos parâmetros System.out.Println ("Execute o método real"); retornar nulo; }} 3.2. Cliente
pacote javaProxy; importar java.lang.reflect.proxy; classe pública client {public static void main (string [] args) {dao dao = mapperproxy.newmapperProxy (Dao.class, null); Dao.save (); }}3.3. Resultados
O acima é um exemplo de uso de proxy dinâmico do JDK. Espero que seja útil para todos aprenderem a programação Java.