하루에 하나의 기술 포인트에 대한 동적 프록시

cglib와 jdk 동적 프록시의 차이점은 무엇입니까?

  1. cglib는 asm 바이트코드 프레임워크를 사용하는 반면, jdk는 반사 메커니즘을 사용하여 cglib가 개체를 느리게 생성하지만 빠르게 실행하도록 합니다. jdk는 개체를 빠르게 생성하지만 상대적으로 느리게 실행합니다.
  2. 디컴파일 후 jdk 동적 프록시는 Proxy 클래스를 상속하고 인터페이스를 구현하는 프록시 클래스를 생성하는 것으로 나타났습니다($class0 extends Proxy implements interfaceA ). 여기서 class0은 인터페이스에서 많은 메서드를 집계하고 메서드를 통해 호출을 구현합니다. 리플렉션 메커니즘을 호출합니다.
  3. 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

추천

출처blog.csdn.net/qq_31236027/article/details/126357059