package test;

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

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

public class TestProxy {
public static void main(String[] args) {

//jdk动态代理,JDK动态代理只能对实现了接口的类生成代理,而不能针对类
final AImpl am = new AImpl();
AInterface ai = (AInterface) Proxy.newProxyInstance(am.getClass().getClassLoader(), am.getClass().getInterfaces(), new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法执行前-start
System.out.println("方法执行前 :" +System.currentTimeMillis());
//end
Object object = method.invoke(am, args);

//方法执行后-start
System.out.println("方法执行后 :" +System.currentTimeMillis());
//end
return object;
}

});
ai.update(1);
ai.save("3");


UserInfoCglib uc = new UserInfoCglib();
UserInfoImpl ui = (UserInfoImpl) uc.getIntance(new UserInfoImpl());
ui.addUser();
}
}

interface AInterface{
public void update(int n);
public int save(String str);
}

class AImpl implements AInterface{

@Override
public void update(int n) {
System.out.println("update......");
}

@Override
public int save(String str) {
System.out.println("save......");
return 1;
}

}

class UserInfoImpl{
public void addUser(){
System.out.println("添加人员");
}
}

class UserInfoCglib implements MethodInterceptor{

//CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法.因为是继承,所以该类或方法最好不要声明成final


private Object target;
/**
* 创建代理对象
*/
public Object getIntance(Object target){
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.target.getClass());
//回调方法
enhancer.setCallback(this);
//创建代理对象
return enhancer.create();
}

@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
System.out.println("------start------");
arg3.invokeSuper(arg0, arg2);
System.out.println("------end-----");
return null;
}

}

posted on 2016-07-11 10:43  zyb_java  阅读(179)  评论(0编辑  收藏  举报