동적 프록시 도구 클래스

2888 단어
나는 방금 동적 에이전트를 쓸 때마다 매우 많은 코드를 쓸 거라고 생각했는데 가치가 없어서 동적 에이전트를 실현하는 도구 종류를 썼다.사용자는 JDK 동적 에이전트를 사용할 수도 있고 CGLIB 동적 에이전트를 사용할 수도 있습니다. 제 ProxyUtils에서 동적 에이전트를 개발하는 세 가지 방식을 제공했습니다.실제적으로 사용하는 과정에서 인터셉터라는 추상적인 유실을 계승할 수 있다. 현재 논리 코드는 앞뒤에 제어 코드를 넣는다.가령 제어 코드가true로 되돌아온다면 통과할 수 있다는 것을 증명하고, 가령 제어 코드가false로 되돌아온다면 검증이 통과되지 않는다는 것을 설명하며, 가령 통과하지 않는다면 논리 코드에서 되돌아오는 '0' 값을 되돌려주고, 논리 코드가 되돌아오는 대상을 가정한다.그러면 null을 되돌려줍니다. 다른 유형이라고 가정하면 각종 유형의 0값을 되돌려줍니다. 사용할 때 인터셉터 클래스를 실현할 수 있고 익명 내부 클래스도 사용할 수 있습니다. 마음에 드시면 다음과 같습니다. 다음은 제 코드입니다. 한 단락의 코드는 하나의 파일을 대표합니다. 나중에 코드를 다시 잘 봉하여 하나의jar 패키지로 만들 것입니다.
package com.utils.AOPInteface;

public enum AOPMethod {
   JDKAOP,CGLIBAOP
}
package com.utils.AOPInteface;

public interface CheckCode {
    boolean intercepterBefore();
    boolean intercepterAfter();
}
package com.utils.AOPInteface;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

abstract class Intercepter implements CheckCode,InvocationHandler,MethodInterceptor{
    private Object obj; 
	public Intercepter(Object obj){
		this.obj=obj;
	}
	final public Object getTarget(){
		return obj;
	}
	@Override
	final public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {
		Object o=null;
		boolean bef=intercepterBefore();
		if(bef){
			o=method.invoke(obj, args);
		}else{
			return null;
		}
		boolean aft=intercepterAfter();
		if(aft){
			return o;
		}else{
			return null;
		}
		
	}
	
	@Override
	final public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		return intercept(proxy, method, args, null);
	}
	
	
	
}
package com.utils.AOPInteface;

import java.lang.reflect.Proxy;

import net.sf.cglib.proxy.Enhancer;

public class ProxyUtils {
	public static Object getJDKProxy(Intercepter intercepter){
		if(intercepter.getTarget().getClass().getInterfaces().length==0){
			return getCGLIBProxy(intercepter);
		}
		return Proxy.newProxyInstance(intercepter.getTarget().getClass().getClassLoader(), intercepter.getTarget().getClass().getInterfaces(), intercepter);
	}
	
	public static Object getCGLIBProxy(Intercepter intercepter){
		Enhancer enhancer=new Enhancer();
		enhancer.setSuperclass(intercepter.getTarget().getClass());
		enhancer.setCallback(intercepter);
		return enhancer.create();
	}
    public static Object getProxy(AOPMethod amethod,Intercepter intercepter){
    	if(amethod==AOPMethod.JDKAOP){
    		return getJDKProxy(intercepter);
    	}else{
    		return getCGLIBProxy(intercepter);
    	}
    }
    static class Print{
    	public int print(){
    	System.out.println("Hello AOP!!!");
    	return 20;
    	}
    }
   
}

좋은 웹페이지 즐겨찾기