static Object newProxyInstance(ClassLoader loader, Class[] interfaces,InvocationHandler h) 参数列表: loader: 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载 interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了 h: 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
Object invoke(Object proxy, Method method, Object[] args) throws Throwable
proxy: 指代我们所代理的那个真实对象
method: 指代的是我们所要调用真实对象的某个方法的Method对象
args: 指代的是调用真实对象某个方法时接受的参数
package com.neuedu.java.phoneProxy; /* * 项目名称:Java-Proxy * @author:wzc * @date 创建时间:2017年8月30日 下午9:00:49 * @Description:一个手机接口 * @parameter * */ public interface Phone { public void sellPhone(); }
package com.neuedu.java.phoneProxy; /* * 项目名称:Java-Proxy * @author:wzc * @date 创建时间:2017年8月30日 下午9:02:26 * @Description:第一代手机,实现手机接口 * @parameter * */ public class phoneOne implements Phone{ @Override public void sellPhone() { System.out.println("我是第一代手机,现在正在热销中"); } }
package com.neuedu.java.phoneProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /* * 项目名称:Java-Proxy * @author:wzc * @date 创建时间:2017年8月30日 下午9:03:49 * @Description:中介类,中介类持有一个委托类对象引用,在invoke方法中调用了委托类对象的相应方法 * @parameter * */ public class phoneProxy implements InvocationHandler{ private Object obj; public phoneProxy(Object obj) { this.obj=obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = method.invoke(obj, args); return result; } }
package com.neuedu.java.junit; import static org.junit.Assert.*; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import org.junit.Test; import com.neuedu.java.phoneProxy.Phone; import com.neuedu.java.phoneProxy.phoneOne; import com.neuedu.java.phoneProxy.phoneProxy; /* * 项目名称:Java-Proxy * @author:wzc * @date 创建时间:2017年8月30日 下午9:05:45 * @Description:测试动态代理 * @parameter * */ public class testPhoneProxy { @Test public void test() { //创建 一个被代理的对象 Phone phone_one=new phoneOne(); //将被代理的对象加入中介类 InvocationHandler handler=new phoneProxy(phone_one); //动态的生成代理类,和被代理的对象类类型相同 Phone phoneProxy_one = (Phone)
Proxy.newProxyInstance(handler.getClass().getClassLoader(), phone_one.getClass().getInterfaces(), handler); //代理商销售手机 phoneProxy_one.sellPhone(); } }
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException { // 检查 h 不为空,否则抛异常 if (h == null) { throw new NullPointerException(); } // 获得与制定类装载器和一组接口相关的代理类类型对象 Class cl = getProxyClass(loader, interfaces); // 通过反射获取构造函数对象并生成代理类实例 try { Constructor cons = cl.getConstructor(constructorParams); return (Object) cons.newInstance(new Object[] { h }); } catch (NoSuchMethodException e) { throw new InternalError(e.toString()); } catch (IllegalAccessException e) { throw new InternalError(e.toString()); } catch (InstantiationException e) { throw new InternalError(e.toString()); } catch (InvocationTargetException e) { throw new InternalError(e.toString()); } }
原文:http://www.cnblogs.com/Actexpler-S/p/7455649.html