一、JDK代理图解
二、基于接口的JDK动态代理
-
提供者:JDK 官方的 Proxy 类。
-
要求:被代理类最少实现一个接口。
-
动态代理特点:字节码随用随创建,随用随加载。
-
代理模式:代理对象代理真实对象,达到增强真实对象功能的目的。
三、JDK代理演示
(1)接口
package com.gql.dao;
import com.gql.staticproxy.User;
/**
* 类说明:
* 接口
* @guoqianliang1998.
*/
public interface UserDao {
void save(User user);
}
(2)目标类
package com.gql.dao;
import com.gql.staticproxy.User;
/**
* 类说明:
* 目标类
* @guoqianliang1998.
*/
public class UserDaoImpl implements UserDao {
@Override
public void save(User user) {
//安全校验+日志记录
System.out.println("保存用户成功...");
}
}
(3)事务类/拦截器
package com.gql.jdkproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import com.gql.transaction.MyTransaction;
/**
* 类说明:
* 事务类/拦截器
* @guoqianliang1998.
*/
public class MyInterceptor implements InvocationHandler{
private Object target;//目标类
private MyTransaction myTransaction;//事务类(切面)
private Logger log;
private Security security;
public MyInterceptor(Object target, MyTransaction myTransaction, Logger log, Security security) {
super();
this.target = target;
this.myTransaction = myTransaction;
this.log = log;
this.security = security;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
myTransaction.begin();
log.log();
security.safe();
method.invoke(target, args);
return null;
}
}
(4)JDK代理类
package com.gql.jdkproxy;
import java.lang.reflect.Proxy;
import com.gql.dao.UserDao;
import com.gql.dao.UserDaoImpl;
import com.gql.staticproxy.User;
import com.gql.transaction.MyTransaction;
import com.sun.xml.internal.bind.v2.runtime.unmarshaller.IntArrayData;
/**
* 类说明:
* JDK代理测试
* @guoqianliang1998.
*/
public class JDKProxyTest {
public static void main(String[] args) {
//目标类
UserDao userDao = new UserDaoImpl();
//事务类
MyTransaction myTransaction = new MyTransaction();
//日志类
Logger log = new Logger();
//安全校验类
Security security = new Security();
//创建拦截器对象
MyInterceptor myInterceptor = new MyInterceptor(userDao,myTransaction,log,security);
//创建代理对象
UserDao userDaoProxy = (UserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), myInterceptor);
userDaoProxy.save(new User());
}
}
(5)日志类
package com.gql.jdkproxy;
/**
* 类说明:
* 日志类
* @guoqianliang1998.
*/
public class Logger {
public void log(){
System.out.println("日志记录...");
}
}
(5)安全校验类
package com.gql.jdkproxy;
/**
* 类说明:
* 安全校验类
* @guoqianliang1998.
*/
public class Security {
public void safe(){
System.out.println("安全校验...");
}
}