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