涉及到两个类
InvocationHandler
Proxy
动态代理有以下特点:
1.代理对象,不需要实现接口
2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
3.动态代理也叫做:JDK代理,接口代理
public interface IUserDao {
void save();
}
实现这个接口
public class UserDao implements IUserDao{
@Override
public void save() {
System.out.println("-----保存数据——------");
}
}
代理工厂类
需要实现InvocationHandler 接口;
public class ProxyFactory implements InvocationHandler{
private Object targer;
public ProxyFactory(Object targer) {
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
this.targer = targer;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
ClassLoader classLoader = proxy.getClass().getClassLoader();
System.out.println("调用方法前:"+ System.currentTimeMillis());
Thread.sleep(1000);
Object invoke = method.invoke(targer, args);
System.out.println("调用方法后:"+ System.currentTimeMillis());
return invoke;
}
public Object getProxyInstance(){
Object o = Proxy.newProxyInstance(targer.getClass().getClassLoader(),
targer.getClass().getInterfaces(), this);
return o;
}
}
侧试
public class App {
public static void main(String[] args) {
UserDao target = new UserDao();
ProxyFactory proxyFactory = new ProxyFactory(target);
IUserDao proxyInstance = (IUserDao)proxyFactory.getProxyInstance();
proxyInstance.save();
}
}