java基础_数据库JDBC_动态代理模式
动态代理(proxy)模式:
jdbc使用的是装饰者模式,而c3p0使用的是动态代理模式生成的Connection对象。
1.动态代理概念:
在程序运行期间,动态生成指定一组接口的一个实现类对象!
这个类没有名字.但是却实现了指定的一组接口中的所有的抽象方法!!
2.动态代理方法的三大参数:
1.ClassLoader loader:指定生成的动态代理类是通过哪个类加载器到达内存中的
2.Class[ ] interfaces:指定代理对象所要实现的接口们
3.InvocationHandler h:指定代理对象的方法调用时是如何处理的
3.代码如下:
package com.proxydemo; /* * 动态代理: * 在程序运行期间动态的生成给定接口们的实例对象!!! * * 动态生成的代理对象的方法调用:实际上绝大多数方法都是走的InvocationHandler中的invoke方法: * */ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface A{ public abstract void a(); public abstract String aa(); public abstract String aaa(String str1,String str2); } interface B{ public abstract void b(); } public class ProxyDemo1 { public static void main(String[] args) throws Exception { //使用Proxy类的静态方法,可以获取一个指定了接口的实现类对象!! /* * 第一个参数:动态生成的类是通过哪个类加载器加载到内存中 * 第二个参数:动态生成的类所实现的接口:Class[] * 第三个参数:动态生成的对象方法调用的处理器! */ //1.借用本类的类加载器 ClassLoader loader = ProxyDemo1.class.getClassLoader();//动态生成的属于系统类加载器。 //2.要实现的接口数组 Class[] interfaces = {A.class,B.class}; //3.调用处理器,InvocationHandler是个接口 InvocationHandler h = new InvocationHandler() {//匿名,InvocationHandler词义为调用处理器 @Override
、 //只有1个抽象方法叫invoke public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("hello"); for (Object obj : args) { System.out.println(obj); } return "xxx"; } }; //动态生成一个实现了指定接口的对象
//使用Proxy类的静态方法,打点调用,需要三个参数分别是1.类加载器,2.接口,3.调用处理器
Object proxy = Proxy.newProxyInstance(loader, interfaces, h);// A a = (A) proxy; // a.a();//空实现 // String res = a.aa(); // System.out.println(res); //带参数的方法调用 String res = a.aaa("abc","def"); System.out.println(res); //调用Object中继承的方法: // proxy.toString();走invoke方法 // proxy.hashCode();走invoke方法 // proxy.wait();走invoke方法 // B b = (B) proxy; // b.b(); } }
拓展:类加载器classloader有三种,1.系统加载器 ; 2. 扩展加载器; 3.根类加载器 。
调用处理器详解:InvocationHandler
调用处理器是代理对象的方法被调用时,如何处理的业务逻辑的一个封装!