动态代理:
1)代理对象,不需要实现接口;
2)代理对象的生成,是利用JDKAPI, 动态的在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型)
3) 动态代理, JDK代理, 接口代理;
JDK中生成代理对象的API:
|-- Proxy
staticObject newProxyInstance(
ClassLoader loader, 指定当前目标对象使用类加载器
Class<?>[] interfaces, 目标对象实现的接口的类型
InvocationHandler h 事件处理器
)
注意:代理对象不需要实现接口,但是目标对象一定要实现接口;否则不能用动态代理!下面我们同样以例子来说明:
首先创建一个IUserDao接口,然后创建目标对象UserDao去实现接口
package cn.qblank.b_dynamic;
/**
* 目标对象:需要实现接口
* @author Administrator
*
*/
public class UserDao implements IUserDao{
@Override
public void save(){
System.out.println("保存数据");
}
}
然后创建代理工厂ProxyFactory
package cn.qblank.b_dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 代理工厂
* 不需要实现接口
* @author Administrator
*
*/
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.qblank.b_dynamic;
public class Test {
public static void main(String[] args) {
//创建目标对象
IUserDao target = new UserDao();
//构建代理对象
IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
proxy.save();
}
}
运行结果如下: