动态代理(转)

 

package cn.itcast.b_dynamic;

// 接口
public interface IUserDao {

    void save();
    
}
package cn.itcast.b_dynamic;

/**
 * 目标对象
 * @author Jie.Yuan
 *
 */
public class UserDao implements IUserDao{

    @Override
    public void save() {
        System.out.println("-----已经保存数据!!!------");
    }

}
package cn.itcast.b_dynamic;

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

/**
 * 给所有的dao创建代理对象【动态代理】
 * 
 * 代理对象,不需要实现接口
 * @author Jie.Yuan
 *
 */
public class ProxyFactory {

    // 维护一个目标对象
    private Object target;
    public ProxyFactory(Object target){
        this.target = target;
    }
    
    // 给目标对象,生成代理对象  
    public Object getProxyInstance() {
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(), 
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args)
                            throws Throwable {
                        System.out.println("开启事务");
                        
                        // 执行目标对象方法
                        Object returnValue = method.invoke(target, args);
                        
                        System.out.println("提交事务");
                        return returnValue;
                    }
                });
    }
}
package cn.itcast.b_dynamic;

public class App {

    public static void main(String[] args) {
        // 目标对象
        IUserDao target = new UserDao();
        // 【原始的类型 class cn.itcast.b_dynamic.UserDao】
        System.out.println(target.getClass());
        
        // 给目标对象,创建代理对象
        IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
        // class $Proxy0   内存中动态生成的代理对象
        System.out.println(proxy.getClass());
        
        // 执行方法   【代理对象】
        proxy.save();
    }
}

 

posted @ 2016-07-19 15:49  damon2016  阅读(186)  评论(0编辑  收藏  举报