A diferença entre o proxy dinâmico cglib e jdk?
- 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
- 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.
- 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