cglib와 jdk 동적 프록시의 차이점은 무엇입니까?
- cglib는 asm 바이트코드 프레임워크를 사용하는 반면, jdk는 반사 메커니즘을 사용하여 cglib가 개체를 느리게 생성하지만 빠르게 실행하도록 합니다. jdk는 개체를 빠르게 생성하지만 상대적으로 느리게 실행합니다.
- 디컴파일 후 jdk 동적 프록시는 Proxy 클래스를 상속하고 인터페이스를 구현하는 프록시 클래스를 생성하는 것으로 나타났습니다($class0 extends Proxy implements interfaceA ). 여기서 class0은 인터페이스에서 많은 메서드를 집계하고 메서드를 통해 호출을 구현합니다. 리플렉션 메커니즘을 호출합니다.
- cglib 동적 프록시는 인터페이스에 의존할 필요가 없지만 cglib 라이브러리에 의존해야 하지만 jdk는 인터페이스에 의존해야 하며 라이브러리에 의존하지 않고 구현할 수 있습니다.
목적: 일반적으로 웹 애플리케이션의 경우 jdk 동적 프록시는 광범위하게 사용되며 cglib 동적 프록시는 대상 인터페이스 없이 프록시되는 클래스에 대해 선택할 수 있습니다.
---------------------------------------------- 2022.8.17---------------- -------------------------------------------------- --------
사용하는 방법? (예를 들어 jdk 동적 프록시를 사용하십시오)
jdk 동적 에이전트는 인터페이스에 크게 의존하므로 먼저 인터페이스를 생성해야 합니다.
/**
* 自定义接口
* @author lenovo
*
*/
public interface MyActionInterface {
void myAction(String username);
}
인터페이스는 모두 구현해야 하므로 나중에 구현 클래스를 생성합니다.
public class MyActionImpl implements MyActionInterface{
@Override
public void myAction(String username) {
System.out.println("action = " + username);
}
}
가장 중요한 단계는 프록시 프록시 처리기를 만드는 것입니다.
/**
* 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;
}
}
마지막 호출
public class ProxyTest {
public static void main(String[] args) {
//注意返回的代理对象为接口对象,需要用接口对象作为返回类型
MyActionInterface impl = (MyActionInterface)new MyProxy(MyActionImpl.class)
.newObject();
impl.myAction("zyg");
}
}
원칙? 소스 코드?
https://baijiahao.baidu.com/s?id=1678997916718732701&wfr=spider&for=pc