Este artigo descreve o modo dinâmico de proxy do padrão de design Java. Compartilhe -o para sua referência, como segue:
O modo estático de proxy foi introduzido anteriormente e o proxy dinâmico é mais poderoso que o modo estático de proxy. Ele pode gerar objetos de proxy dinamicamente quando o programa está em execução. A chamada classe dinâmica de proxy é uma classe gerada em tempo de execução. Ao gerá -lo, você deve fornecer um conjunto de interfaces e a classe de proxy dinâmica afirma que ele implementa essas interfaces. Obviamente, a classe dinâmica de proxy atua como um proxy. Você não tenta ajudá -lo a fazer um trabalho substancial. Ao gerar sua instância, você deve fornecer um manipulador e ele assumirá o trabalho real.
O papel do proxy dinâmico é o mesmo que o proxy estático:
① Função abstrata: Uma interface comum entre objetos reais e objetos de proxy. O que precisa ser feito ao declarar objetos reais e objetos de proxy.
② Função real: implemente papéis abstratos, defina a lógica de negócios a ser implementada pelo papel real e seja chamado pela função de procuração.
③ Função dinâmica de proxy: a interface InvocationHandler precisa ser implementada e o método Invoke é implementado. O proxy dinâmico sente que possui uma referência de tipo de objeto, que indica a função que requer proxy dinâmico. Definido como tipo de objeto, o que significa que qualquer tipo de objeto pode ser dinamicamente proxado.
Aqui está um exemplo de código simples de um simples padrão de proxy dinâmico:
1. Função abstrata : Uma interface comum entre objetos reais e objetos de proxy. O que precisa ser feito ao declarar objetos reais e objetos de proxy.
pacote com.tydic.dynamicproxy; interface pública Assunto {public void request ();}2. Função real : um papel abstrato precisa ser implementado, que é um objeto a ser proxyed.
pacote com.tydic.dynamicproxy; public class RealSubject implementa o assunto {@Override public void request () {System.out.println ("do assunto real!"); }} 3. Função dinâmica de proxy : você precisa implementar a interface InvocationHandler e reescrever o método Invoke na interface public Object invoke(Object proxy, Method method, Object[] args) . O método Invoke possui três parâmetros. O proxy do parâmetro refere -se à classe de proxy, o método representa o método proxy, args é a matriz de parâmetros no método e o objeto de valor de retorno é o valor retornado pela chamada do método da instância de proxy. Este método abstrato é implementado dinamicamente na classe de proxy.
pacote com.tydic.dynamicproxy; importar java.lang.reflect.invocationHandler; importar java.lang.reflect.method; public class Dynamicsubject implementos InvocationHandler {Private Object sub; } @Override Public Object Invoke (proxy do objeto, método do método, objeto [] args) lança arremesso {System.out.println ("antes de chamar:" + método); // A função pode ser adicionada antes e depois do método do proxy. System.out.println ("Após chamar:" + método); retornar nulo; }} 4. Escreva código do cliente : é necessária uma classe proxy. A classe pai de todas as classes dinâmicas de proxy da classe de proxy, fornecendo métodos estáticos para criar classes e instâncias dinâmicas de proxy. A classe de proxy possui um método estático public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) . O primeiro parâmetro representa o carregador de classe da classe dinâmica de proxy, a segunda é a matriz de classe da interface que a classe de proxy dinâmica deve implementar e o terceiro parâmetro é o objeto InvocationHandler. Quando o proxy dinâmico chama o método que requer o proxy, o método Invoke do objeto InvocationHandler será chamado.
pacote com.tydic.dynamicproxy; importar java.lang.reflect.proxy; public class cliente {public static void main (string [] args) {sujeito = new RealSubject (); Dynamicsubject Handle = new Dynamicsubject (sujeito); // geração dinâmica Proxy Objeto Assunto Sub = (sujeito) proxy.NewProxyInstance (Dynamicsubject.class.getClassLoadeler (), sujeito.getclass (). GetInterfaces (), handle); Sub.Request (); // O método Invoke de Handle é realmente chamado}}For more Java-related content, readers who are interested in this site can view the topics: "Introduction and Advanced Tutorial on Java Object-Oriented Programming", "Tutorial on Java Data Structure and Algorithm", "Summary of Java Operation DOM Node Skills", "Summary of Java File and Directory Operation Skills" and "Summary of Java Cache Operation Skills"
Espero que este artigo seja útil para a programação Java de todos.