动态代理:
在程序运行过程中产生的这个对象;运行特点:在程序的执行过程中,通过一个类Proxy和接口invacationHandler(处理程序)实现动态代理;
Proxy类中的方法创建动态代理类对象:
public static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h);
InvocationHandler接口:
Object invoke(Object proxy,Method method,Object[] args);
参数1:loader类加载器 public ClassLoader getClassLoader():返回该类的类加载器;
参数2:public Class[] getInterfaces():如果此对象表示一个类,则返回一个数组,它包含了该类所实现的所有接口的对象;
举例:
提供一个针对用户操作的接口:
package org.westos_test3; /** * * 针对用户操作的接口 * 提供了增删改查的方法 * */ public interface UserDao { public abstract void add() ;//增加 public abstract void delete() ;//删除 public abstract void update() ;//修改 public abstract void find() ;//查询 }实现UserDao接口:
package org.westos_test3; //ssh 老框架 public class UserDaoImpl implements UserDao { @Override public void add() { System.out.println("调用了增加功能"); } @Override public void delete() { System.out.println("调用了删除功能"); } @Override public void update() { System.out.println("调用了修改功能"); } @Override public void find() { System.out.println("调用了查询功能"); } }代理的类:
package org.westos_test3; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyInvocationHandler implements InvocationHandler { //给哪个对象生成代理 (目标对象) private Object target ; public MyInvocationHandler(Object target) { this.target = target ; } @Override //proxy:在其上调用方法的代理实例; //method:当前底层实现的方法; //args:参数,传入的是对象的数组; //返回值类型为:Object; public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //实现代理的程序 System.out.println("权限校验"); Object obj = method.invoke(target, args) ;//给target进行代理; System.out.println("日志记录"); return obj;//返回的就是代理对象 } }测试类:
package org.westos_test3; import java.lang.reflect.Proxy; /** * 动态代理的测试类; * */ public class Test { public static void main(String[] args) { // 创建UserDao对象 UserDao ud = new UserDaoImpl(); ud.add(); ud.delete(); ud.update(); ud.find(); System.out.println("------------------"); // 针对UserDao对象ud给它生产一个代理对象 // 调用处理程序,接口实现类中产生代理 MyInvocationHandler handler = new MyInvocationHandler(ud); UserDao ud2 = (UserDao) Proxy.newProxyInstance(ud.getClass().getClassLoader(),ud.getClass().getInterfaces(),handler); ud2.add(); ud2.delete(); ud2.update(); ud2.find(); } }