JDK动态代理
JDK动态代理
动态代理模式的基本介绍
-
代理对象,不需要实现接口,但是目标对象要实现接口,否则不能用动态代理
-
代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象
-
动态代理也叫做:JDK代理、接口代理
JDK中生成代理对象的API
-
代理类所在包:java.lang.reflect.Proxy
-
JDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整的写法:
static Object newProxyInstance(ClassLoader,Class<?>[] interfaces,InvocationHandler h)
//抽象主题
public interface ITeacherDao {
void teach(); //授课方法
void sayHello(String name);
}
//真实主题
public class TeacherDao implements ITeacherDao{
@Override
public void teach() {
System.out.println("老师授课中。。。");
}
public void sayHello(String name){
System.out.println("hello"+name);
}
}
public class ProxyFactory {
//维护一个目标对象
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
//给真实对象生成一个代理对象
public Object getProxyInstance(){
/*
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
*/
//1.ClassLoader loader:指定当前真实对象使用的类加载器,获取加载器的方法固定
//2.Class<?>[] interfaces:真实对象实现的接口类型,使用泛型方法确认类型
//3.InvocationHandler h:事件处理,执行真实对象的方法时,
// 会触发事件处理器的方法,会把当前执行的目标对象方法作为参数传入
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("JDk代理开始");
//通过反射机制调用目标对象的方法
Object returnVal = method.invoke(target, args);
System.out.println("JDK代理提交");
return returnVal;
}
}
);
}
}
public class Client {
public static void main(String[] args) {
//创建真实对象
ITeacherDao target = new TeacherDao();
//给真实对象创建代理对象
ITeacherDao proxyInstance = (ITeacherDao) new ProxyFactory(target).getProxyInstance();
//可以看出内存中动态的生成了代理对象
System.out.println(proxyInstance.getClass());
proxyInstance.teach();
proxyInstance.sayHello("Jay");
}
}