package com.java.proxy.jdk;
public interface Student {
public void addStudent ();
}
package com.java.proxy.jdk;
public class StudentImpl implements StudentDao{
public void addStudent () {
System.out.println("正在插入学生信息...");
}
}
package com.java.proxy.jdk;
public class JDKProxy {
public static void main(String[] args) {
//1.创建一个对象
StudentDao dao = new StudentImpl();
dao.add();
//此处输出:正在插入学生信息...
}
}
但是我们这里血药用到jdk的动态代理:
代码如下:
package com.java.proxy.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// JDK是对对象做代理
public class JDKProxy implements InvocationHandler{
private StudentDao studentDao; //定义一个全局变量方便后面用到
//定义一个方法用于创建JDK代理对象
//JDK代理是对对象做代理
public StudentDaocreateProxyObject(StudentDao studentDao){
//被代理对象作为参数传入进来
this.studentDao= studentDao;
//获取类加载器:对谁做代理,使用谁的类加载器
ClassLoader loader = studentDao.getClass().getClassLoader();
//获取被代理对象的所有实现接口
Class<?>[] interfaces = studentDao.getClass().getInterfaces();
//创建Handler对象
InvocationHandler h = this;
Object proxyObject = Proxy.newProxyInstance(loader, interfaces, h); //创建代理对象
return (StudentDao) proxyObject;
}
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
//这里面可以写一些你需要增强的代码
System.out.println("正在连接数据库");
//对原始操作进行调用(反射)
method.invoke(studentDao, args);
System.out.println("开始关闭数据库");
return null;
}
public static void main(String[] args) {
//1.创建一个对象
UserDao dao = new UserImpl();
//2.为原始对象创建代理对象
UserDao daoProxy = new JDKProxy().createProxyObject(dao); //其中这里面穿的是个对象
//3.使用代理对象运行操作
daoProxy.add();
/**
* 运行结果 :正在连接数据库
正在插入学生信息...
开始关闭数据库
*
*
/
}
}
希望对你们有帮助,自己也在学习这个,分享下。