我们创建一个TeacherDao类来教课,需要创建一个代理老师来教课。
第一步:先创建一个接口
public interface ITTeacherDao {
public void teach();
}
第二步:创建一个教课的老师类
public class TeacherDao implements ITTeacherDao {
@Override
public void teach() {
System.out.println("老师正在讲课");
}
}
第三步:利用JDK创建代理对象
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 static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
ClassLoader loader :指定当前目标对象使用的类加载器,获取加载器的方法固定
Class<?>[] interfaces:目标对象实现的接口类型,使用泛型方法确认类型
InvocationHandler h:事情处理,执行目标对象的方法是,会出发事情处理器方法,会把当前执行的目标对象方法作为参数传入
*/
public Object getProxyInstance(){
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 returnResult = method.invoke(target, args);
System.out.println("JDK动态代理结束");
return returnResult;
}
});
}
}
最后测试类以及结果结果:
public class TeacherTest002 {
public static void main(String[] args) {
//创建一个目标对象
TeacherDao teacherDao = new TeacherDao();
//给目标对象创建代理对象
ProxyFactory proxyFactory = new ProxyFactory(teacherDao);
ITTeacherDao proxyTeacherDao = (ITTeacherDao) proxyFactory.getProxyInstance();
//通过代理对象,调用目标对象的方法
proxyTeacherDao.teach();
}
}
输出的结果如下:
JDK动态代理开始
老师正在讲课
JDK动态代理结束