Artigo Diretório
Prefácio
Reflexão, é como uma espécie de mágica. A introdução de recursos de introspecção em tempo de execução dá à linguagem Java uma vitalidade inesperada. Manipulando metadados ou objetos em tempo de execução, o Java pode manipular com flexibilidade informações que só podem ser determinadas em tempo de execução. O agente dinâmico é uma tecnologia estendida amplamente utilizada no desenvolvimento de produtos. Muitas programações tediosas e repetitivas podem ser resolvidas com elegância pelo mecanismo do agente dinâmico.
Modelo de agente de pré-conhecimento
O cenário simula o usuário fazendo um pedido e ligando para o fornecedor para adicionar o log do agente
1 Demo.java
2 ProxySubOrder.java 代理日之类
3 RealSubOrder.java 实现类
4 SubOrder.java 接口
Demo.java
/**
* @ClassName Demo
* @Author xiaojinlu
* @Date 2020/11/5 17:03
* @Version 1.0
*/
public class Demo {
public static void main(String[] args) {
SubOrder subOrder = new ProxySubOrder();
subOrder.getSupplier();
}
}
ProxySubOrder.java
import org.springframework.beans.factory.annotation.Autowired;
/**
* 主要添加供应商调用前后日志
* 代理下单在调用供应商的时候组做些事情
* @ClassName ProxySubOrder
* @Author xiaojinlu
* @Date 2020/11/5 17:07
* @Version 1.0
*/
public class ProxySubOrder implements SubOrder{
@Autowired
private ProxySubOrder proxySubOrder;
@Override
public void getSupplier() {
System.out.println("start invoke supplier");
//or SubOrder subOrder = new ProxySubOrder(); local Test implement this
proxySubOrder.getSupplier();
System.out.println("end invoke supplier");
}
}
RealSubOrder.java
/**
* @ClassName RealSubOrder
* @Author xiaojinlu
* @Date 2020/11/5 17:06
* @Version 1.0
*/
public class RealSubOrder implements SubOrder {
@Override
public void getSupplier() {
System.out.println("do Something");
}
}
SubOrder.java
/** 接口
* @ClassName SubOrder
* @Author xiaojinlu
* @Date 2020/11/5 17:04
* @Version 1.0
*/
public interface SubOrder {
void getSupplier();
}
1. Definição
Aprimore a função original sem afetar o código original. Reflexão, é como uma espécie de mágica. A introdução de recursos de introspecção em tempo de execução dá à linguagem Java uma vitalidade inesperada. Manipulando metadados ou objetos em tempo de execução, o Java pode manipular com flexibilidade informações que só podem ser determinadas em tempo de execução. O agente dinâmico é uma tecnologia estendida amplamente utilizada no desenvolvimento de produtos. Muitas programações tediosas e repetitivas podem ser resolvidas com elegância pelo mecanismo do agente dinâmico.Dois, cenários de aplicação
1.日志
2.用户鉴权
3.全局性异常处理
4.性能监控
5.事务处理
等
O AOP permite que os desenvolvedores escapem dessas questões tediosas por meio de um mecanismo de proxy (dinâmico), melhorando muito a abstração e a reutilização do código. Falando logicamente, nossos agentes semelhantes em design e implementação de software, como Facade, Observer e muitos outros propósitos de design, podem ser alcançados com elegância por meio de agentes dinâmicos.
Três, classificação de agente
---- Proxy estático: escreva a classe de proxy com antecedência, você pode escrevê-la manualmente ou gerá-la com ferramentas. A desvantagem é que cada classe de negócio deve corresponder a uma classe proxy, que é muito inflexível.
---- Proxy dinâmico: gere objetos proxy automaticamente em tempo de execução. A desvantagem é que leva mais tempo para gerar objetos de proxy e chamar métodos de proxy.
---- Proxy dinâmico JDK: baseado na implementação do mecanismo de reflexão Java, você deve entender o tipo de negócio da interface para gerar objetos proxy desta forma. A nova versão também começou a incorporar o mecanismo ASM.
---- proxy dinâmico cglib: Com base no mecanismo ASM, as subclasses das classes de negócios são geradas como classes proxy.
Quatro, expansão
Mecanismo de reflexão
① Apresente
O mecanismo de reflexão do Java raramente é usado no processo normal de desenvolvimento de negócios, mas é amplamente usado na construção de alguns frameworks básicos
②O que é o mecanismo de reflexão Java
O mecanismo de reflexão Java está no estado de execução, para qualquer classe, você pode conhecer todas as propriedades e métodos desta classe; para qualquer objeto, você pode chamar qualquer um de seus métodos e propriedades; esta aquisição dinâmica de informações e chamada dinâmica de métodos de objeto A função é chamada de mecanismo de reflexão da linguagem java.
③Quais as funções que o mecanismo de reflexão oferece?
---- Determine a classe à qual qualquer objeto pertence em tempo de execução
---- Construir um objeto de qualquer classe em tempo de execução
---- Determine as variáveis de membro e métodos de qualquer classe em tempo de execução
---- Chame qualquer método de objeto em tempo de execução
---- Gerar proxy dinâmico
④ Cenários de aplicação do mecanismo de reflexão
---- Proxy dinâmico (AOP, RPC)
---- Fornece recursos de extensão para desenvolvedores de terceiros (contêiner Servlet, conexão JDBC)
---- Objeto de criação de componente de terceiros (OI)
---- Código reverso, como descompilação
---- Estrutura combinada com anotações, como Retrofit
---- Framework de aplicativo de mecanismo de reflexão pura, como EventBus 2.x
---- Framework de classe gerado dinamicamente, como Gson
⑤ Vantagens e desvantagens do mecanismo de reflexão:
---- Vantagens: julgamento do tipo de tempo de execução, carregamento de classe dinâmica, proxy dinâmico usando reflexão
---- Desvantagens: O desempenho é um problema, a reflexão é equivalente a uma série de operações de interpretação, dizendo ao jvm para fazer as coisas, o desempenho é muito mais lento do que o código Java direto.
Vantagens do JDK Proxy:
Minimizar dependências e reduzir dependências significa simplificar o desenvolvimento e a manutenção.O suporte do próprio JDK pode ser mais confiável do que o cglib.
Atualize suavemente a versão JDK e a biblioteca de bytecode geralmente precisa ser atualizada para garantir que possa ser usada na nova versão do Java.
O código é simples de implementar.
Com base nas vantagens da estrutura cglib semelhante:
Às vezes, pode ser inconveniente chamar o destino para implementar interfaces adicionais. De uma certa perspectiva, restringir o chamador para implementar a interface é uma prática um tanto intrusiva. Semelhante ao proxy dinâmico cglib, não há tal restrição.
Operar apenas as classes que nos interessam, sem ter que aumentar a carga de trabalho para outras classes relacionadas.
alta performance.
Resumindo
1 Reduzida redundância de código.
2 Perceba a capacidade de processamento unificado.