java动态代理(1)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011747152/article/details/84859497

代码

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

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;



public class Main {
    public static void main(String[] args) {
    	//java动态代理   需要有接口
        RealObject real = new RealObject();
        Interface proxy = (Interface) Proxy.newProxyInstance(
                Interface.class.getClassLoader(), new Class[] {Interface.class},
                new DynamicProxyHandler(real));
        
        proxy.doSomething();
        proxy.somethingElse("gg");
        //cglib动态代理
        BookFacadeImpl1 bookFacade=new BookFacadeImpl1();
        BookFacadeCglib  cglib=new BookFacadeCglib();  
        BookFacadeImpl1 bookCglib=(BookFacadeImpl1)cglib.getInstance(bookFacade);  
        bookCglib.addBook();  
    }
}
//java动态代理
 class DynamicProxyHandler implements InvocationHandler {
    private Object proxyed;
    
    public DynamicProxyHandler(Object proxyed) {
        this.proxyed = proxyed;
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        System.out.println("代理工作了.");
        return method.invoke(proxyed, args);
    }
}
 interface Interface {
    void doSomething();
    void somethingElse(String arg);
}
 class RealObject implements Interface {
    public void doSomething() {
        System.out.println("doSomething.");
    }
    public void somethingElse(String arg) {
        System.out.println("somethingElse " + arg);
    }
}
 //cglib动态代理
 class BookFacadeImpl1 {  
	    public void addBook() {  
	        System.out.println("新增图书...");  
	    }  
} 
  class BookFacadeCglib implements MethodInterceptor {  
	    private Object target;//业务类对象,供代理方法中进行真正的业务方法调用
	  
	    //相当于JDK动态代理中的绑定
	    public Object getInstance(Object target) {  
	        this.target = target;  //给业务对象赋值
	        Enhancer enhancer = new Enhancer(); //创建加强器,用来创建动态代理类
	        enhancer.setSuperclass(this.target.getClass());  //为加强器指定要代理的业务类(即:为下面生成的代理类指定父类)
	        //设置回调:对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要实现intercept()方法进行拦
	        enhancer.setCallback(this); 
	       // 创建动态代理类对象并返回  
	       return enhancer.create(); 
	    }
	    // 实现回调方法 
	    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { 
	        System.out.println("预处理——————");
	        proxy.invokeSuper(obj, args); //调用业务类(父类中)的方法
	        System.out.println("调用后操作——————");
	        return null; 
	    }
  }

输出

代理工作了.
doSomething.
代理工作了.
somethingElse gg
预处理——————
新增图书...
调用后操作——————

猜你喜欢

转载自blog.csdn.net/u011747152/article/details/84859497