Proxy dinâmico para um ponto técnico por dia

A diferença entre o proxy dinâmico cglib e jdk?

  1. cglib usa a estrutura asm bytecode, enquanto jdk usa o mecanismo de reflexão, que faz com que cglib crie objetos lentamente, mas os execute rapidamente jdk cria objetos rapidamente, mas executa relativamente devagar
  2. Após a descompilação, verifica-se que o proxy dinâmico jdk cria uma classe proxy que herda a classe Proxy e implementa a interface ($class0 extends Proxy implements interfaceA ), onde class0 agrega muitos métodos na interface e implementa a chamada por meio do método. invocar o mecanismo de reflexão.
  3. O proxy dinâmico cglib não precisa depender da interface, mas precisa contar com a biblioteca cglib, mas o jdk precisa contar com a interface e pode ser implementado sem depender da biblioteca.

Finalidade: De um modo geral, para aplicativos da Web, o jdk dynamic proxy tem uma ampla gama de usos e o cglib dynamic proxy pode ser selecionado para classes a serem proxy sem interfaces de destino

------------------------------------- 2022.08.17---------------- -------------------------------------------------- --------

Como usar? (Tome o proxy dinâmico jdk como exemplo)

O agente dinâmico jdk é fortemente dependente da interface, então primeiro precisamos criar uma interface


/**
 * 自定义接口
 * @author lenovo
 *
 */
public interface MyActionInterface {
    
    
	void myAction(String username);
}

Todas as interfaces devem ser implementadas, então crie uma classe de implementação depois

public class MyActionImpl implements MyActionInterface{
    
    

	@Override
	public void myAction(String username) {
    
    
		System.out.println("action = " + username);
	}
}

A etapa mais crítica é criar um manipulador de proxy proxy

/**
 * jdk 动态代理
 * @author 章鱼哥
 *
 */
public class MyProxy implements InvocationHandler{
    
    
	/**
	 * 代理对象
	 */
	private Object target;
	
	/**
	 * 直接传入类信息
	 * @param target
	 */
	public MyProxy(Object target) {
    
    
		this.target = target;
	}
	
	/**
	 * 通过class字节码获取类信息
	 * @param targetClass
	 */
	public MyProxy(Class<?> targetClass) {
    
    
		try {
    
    
			this.target = targetClass.newInstance();
		} catch (InstantiationException e) {
    
    
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
    
    
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 通过jdk 动态代理创建对象,进行封装
	 */
	public Object newObject() {
    
    
		if (target == null) {
    
    
			throw new RuntimeException("代理对象为空");
		}
		return Proxy.newProxyInstance(target.getClass().getClassLoader(),
				target.getClass().getInterfaces(), this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
    
		// TODO Auto-generated method stub
		//预处理
		Object result = method.invoke(target, args);
		//处理结果
		return result;
	}
}

última chamada

public class ProxyTest {
    
    
	public static void main(String[] args) {
    
    
		//注意返回的代理对象为接口对象,需要用接口对象作为返回类型
		MyActionInterface impl = (MyActionInterface)new MyProxy(MyActionImpl.class)
				.newObject();
		impl.myAction("zyg");
	}
}

princípio? Código fonte?

https://baijiahao.baidu.com/s?id=1678997916718732701&wfr=spider&for=pc

Acho que você gosta

Origin blog.csdn.net/qq_31236027/article/details/126357059
Recomendado
Clasificación