本帖最后由 天地有我 于 2013-9-11 22:08 编辑
package handler;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class DynamicTest
{
public static void main(String[] args) throws Exception
{
Subject subject = new RealSubject();
InvocationHandler handler = new MyInvocationHandler(subject);
Class<?> proxyClass = Proxy.getProxyClass(Subject.class
.getClassLoader(), subject.getClass().getInterfaces());
//我是查java帮助文档。下面注释是帮助文档说明。
/*
*
* public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。此方法相当于:
Proxy.getProxyClass(loader, interfaces).
getConstructor(new Class[] { InvocationHandler.class }).
newInstance(new Object[] { handler });
Proxy.newProxyInstance 抛出 IllegalArgumentException,原因与 Proxy.getProxyClass 相同。
*
* */
//这里的字节码类只能写成InvocationHandler的字节码类不能写成自己实现接口类的字节码
Constructor<?> con = proxyClass.getConstructor(InvocationHandler.class);
//这里生成对象的时候传入自己的实现类对象
Subject subProxy = (Subject) con.newInstance(handler);
//也可以以下面这种方式简写,一部完成
Subject subProxy1 = (Subject)Proxy.newProxyInstance(subject.getClass()
.getClassLoader(), subject.getClass().getInterfaces(),
new MyInvocationHandler(subject));
System.out.println(subProxy.add(12, 12));
System.out.println(subProxy1.add(13, 12));
}
输出结果为 :
24
25
|