实验目录:
userManager接口与实现:
package users;
public interface userManager {
public void addUser();
public String checkUser();
}
package users;
public class userManagerImpl implements userManager{
public void addUser() {
System.out.println("user added.");
}
public String checkUser() {
System.out.print("user checked is this No:");
return "007";
}
}
package proxy;
import users.userManager;
import users.userManagerImpl;
public class client {
public static void main(String[] args) {
dynamicProxyTest dpt = new dynamicProxyTest();
userManager um = (userManager) dpt.newProxy(new userManagerImpl());
um.addUser();
System.out.println(um.checkUser());
}
}
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class dynamicProxyTest implements InvocationHandler {
private Object tagetObject;
public Object newProxy(Object o) {
this.tagetObject = o;
return Proxy.newProxyInstance(o.getClass().getClassLoader(),
o.getClass().getInterfaces(),
this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
advice();
Object ret = null;
try {
ret = method.invoke(this.tagetObject, args);
}catch(Exception e) {
e.printStackTrace();
}
return ret;
}
private void advice() {
System.out.println("-------------advice logic---------------");
}
}
大概的执行过程:
由client端进入,执行newProxy()方法,返回一个实现了代理逻辑的代理类。
newProxy()方法的参数是目标类,即织入正交逻辑之前的类。通过debug可以看到,得到的userManager——um对象里包含了一个dynamicProxyTest对象h。
并且可以发现,在执行代理类的addUser()方法的时候,会先寻找dynamicProxyTest中的invoke()方法作为入口,完成advice(),然后会调用method的invoke()方法,来决定advice()中的逻辑是织入原本的哪个方法之中。其中,打印method参数会输出具体执行的是哪个目标接口的哪个方法,参数args是传入此method的参数列表。
注意:JDK实现动态代理必须针对接口,如果是针对没有实现接口的类,则无法正常返回一个想要的代理类。
最终的输出结果:
-------------advice logic---------------
user added.
-------------advice logic---------------
user checked is this No:007