动态代理在程序运行时由反射机制动态创建而成。为其他对象创建一个代理以控制对这个对象的访问。
实现动态代理:
LogInterceptor.java
package com.spring.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class LogInterceptor2 implements InvocationHandler{
private Object target;
public Object newProxyInstance(Object target) {
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
public void beforeMethod(Method m){
System.out.println(m.getName()+" start");
}
@Override
public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable {
beforeMethod(m);
m.invoke(target, args);
return null;
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
}
TestUserService.java
@Test
public void testProxy(){
//UserDAO userDAO = new UserDAOImpl();
LogInterceptor2 li2 = new LogInterceptor2();
//li2.setTarget(userDAO);
//UserDAO userDAOProxy =(UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), new Class[]{UserDAO.class}, li2);
UserDAO userDAOProxy =(UserDAO)li2.newProxyInstance(new UserDAOImpl());
userDAOProxy.save(new User());
}
或者
LogInterceptor.java
package com.spring.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class LogInterceptor2 implements InvocationHandler{
private Object target;
// public Object newProxyInstance(Object target) {
// this.target = target;
// return Proxy.newProxyInstance(target.getClass().getClassLoader(),
// target.getClass().getInterfaces(), this);
// }
public void beforeMethod(Method m){
System.out.println(m.getName()+" start");
}
@Override
public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable {
beforeMethod(m);
m.invoke(target, args);
return null;
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
}
TestUserService.java
@Test
public void testProxy(){
UserDAO userDAO = new UserDAOImpl();
LogInterceptor2 li2 = new LogInterceptor2();
li2.setTarget(userDAO);
UserDAO userDAOProxy =(UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), new Class[]{UserDAO.class}, li2);
//UserDAO userDAOProxy =(UserDAO)li2.newProxyInstance(new UserDAOImpl());
userDAOProxy.save(new User());
}
Proxy
Proxy类中的newProxyInstance(ClassLoader loader, Class< ?>[] interface, InvocationHandler h)方法中的三个参数
ClassLoader loader:类加载器(产生代理对象的ClassLoader)
Class< ?>[] interface:产生的代理对象实现的接口
InvocationHandler h:使用哪个Handler进行处理
动态代理产生过程
jdk中的动态代理
Proxy会产生一个代理对象(userDAOProxy),这个对象根据要实现的接口类产生。接口中有哪些方法,产生的代理中就有哪些方法。
代理中的方法如何实现
代理中的方法在调用时,会把代理自身,实现的方法以及参数传到invoke中。invoke方法首先执行自己的逻辑,然后会调被代理对象的method。这样就实现了动态代理。
模拟实现过程:
class &Proxy4 implements UserDAO{
save(User u){
Method m = UserDAO.getClass().getMethod();
li.invoke(this,m,u);
}
}