夜光序言:
你知道,这世界如此寂寞。没有按下的发送键,季风的转向,云雨的流动和鸟的迁徙。以及,没有对你说出口的,再见。
正文:
以道御术 / 以术识道
package 代理模式.静态代理;
//接口
public interface ITeacherDao {
void teach(); //授课的方法
}
package 代理模式.静态代理;
public class TeacherDao implements ITeacherDao{
@Override
public void teach() {
System.out.println(" 老师授课中.... ");
}
}
package 代理模式.静态代理;
//代理对象,静态代理
public class TeacherDaoProxy implements ITeacherDao{
//定义一个字段
private ITeacherDao target; //目标对象,通过接口来聚合
//下面写一个构造器
public TeacherDaoProxy(ITeacherDao target) {
this.target = target;
}
@Override
public void teach() {
System.out.println("代理对象开始代理");
target.teach();
System.out.println("代理结束");
}
}
package 代理模式.静态代理;
public class Client {
public static void main(String[] args) {
//创建目标对象(被代理对象)
TeacherDao teacherDao = new TeacherDao();
//创建代理对象,同时将被代理对象传递给代理对象
TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao);
//通过代理对象,调用到被代理对象的方法
//即:执行的是代理对象的方法,代理对象再去调用目标对象的方法
teacherDaoProxy.teach();
}
}
package 代理模式.动态代理;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactory {
//维护一个目标对象 object类型
private Object target;
//我们创建一个构造器 对target进行初始化
public ProxyFactory(Object target) {
this.target = target;
}
//给目标对象生成一个代理对象
public Object getProxyInstance(){
//夜光:说明
//1. 第一个参数 ClassLoader loader 指定当前目标对象使用的类加载器,获取加载器方法的固定
//2. Class<?>[] interfaces 目标对象实现的接口类型,使用泛型的方式确认类型
//3. InvocationHandler h 事件处理,执行目标对象方法时,会触发事件处理方法
//会把当前执行的目标对象方法作为参数传入
/* public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
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);
return returnVal;
}
});
}
}
package 代理模式.动态代理;
//接口
public interface ITeacherDao {
void teach(); //授课的方法
}
package 代理模式.动态代理;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactory {
//维护一个目标对象 object类型
private Object target;
//我们创建一个构造器 对target进行初始化
public ProxyFactory(Object target) {
this.target = target;
}
//给目标对象生成一个代理对象
public Object getProxyInstance(){
//夜光:说明
//1. 第一个参数 ClassLoader loader 指定当前目标对象使用的类加载器,获取加载器方法的固定
//2. Class<?>[] interfaces 目标对象实现的接口类型,使用泛型的方式确认类型
//3. InvocationHandler h 事件处理,执行目标对象方法时,会触发事件处理方法
//会把当前执行的目标对象方法作为参数传入
/* public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
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);
return returnVal;
}
});
}
}
package 代理模式.动态代理;
public class TeacherDao implements ITeacherDao{
@Override
public void teach() {
System.out.println(" 老师授课中.... ");
}
}
package 代理模式.动态代理;
public class Client {
public static void main(String[] args) {
//创建目标对象
ITeacherDao target = new TeacherDao();
//给目标对象,创建代理对象 可以转换成ITeacherDao
ITeacherDao proxyInstance = (ITeacherDao)new ProxyFactory(target).getProxyInstance();
System.out.println(proxyInstance);
}
}