代码改变世界

JDK 动态代理

2013-02-28 13:45  hduhans  阅读(123)  评论(0)    收藏  举报

JDK动态代理一个简单的例子:

1.UserDao.java

package proxy.myproxy.dynamicProxy;

public interface UserDao {
    void save();    
    void delete();    
}

2.UserDaoImpl.java

package proxy.myproxy.dynamicProxy;

public class UserDaoImpl implements UserDao{

    public void save() {
        System.out.println("UserDao save()");
    }

    public void delete() {
        System.out.println("User deleted()");
    }
}

3.InvocationHandlerImpl.java

package proxy.myproxy.dynamicProxy;
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class InvocationHandlerImpl implements InvocationHandler {
    private Object target;
    public InvocationHandlerImpl(Object target){
        this.target = target;
    }
    public Object invoke(Object proxy, Method method, Object[] args)//args是那个你执行的那个方法的参数
            throws Throwable {
        System.out.println(proxy.getClass());//这里输出:class $Proxy0,可以看出proxy是什么
        System.out.println(target.getClass());//这里输出:class proxy.myproxy.dynamicProxy.UserDaoImpl,可以看出target是什么
        System.out.println(method.getName()+"开始");
        Object obj = method.invoke(target, args);//obj是方法执行完之后的返回值
        System.out.println("结束");
        return obj;
    }
}

4.测试类Test.java

package proxy.myproxy.dynamicProxy;
import java.lang.reflect.Proxy;

public class Test {
    public static void main(String[] args) {
        UserDao userDao = new UserDaoImpl();
        UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), new InvocationHandlerImpl(userDao));
        userDaoProxy.delete();
        userDaoProxy.save();
    }
}