public static void main(String[] args) { Subject subject = new RealSubject(); InvocationHandler handler = new SubjectHandler(subject); ClassLoader cl = subject.getClass().getClassLoader(); Subject proxy = (Subject) Proxy.newProxyInstance(cl, subject.getClass().getInterfaces(), handler); proxy.request(); }
public static void main(String[] args) throws Exception { Subject sub = new RealSubject(); Subject proxySub = (Subject) Proxy.newProxyInstance( Subject.class.getClassLoader(), new Class[] {Subject.class}, new ProxyHandler(sub)); proxySub.say("fengxiang"); byte[] buffer = ProxyGenerator.generateProxyClass("ProxyClass", new Class[] {Subject.class}); FileOutputStream out = new FileOutputStream("ProxyClass.class"); out.write(buffer); out.close(); // 从这里可以看到具体的接口创建代理的时候, 只会创建一个代理类, 而当前代理类的构造方法的参数就是InvocationHandler接口的对象, 所以如果 // 想要生成不同的对象, 并且有不同的功能, 此时直接设置不同的InvocationHandler就可以了, 就可以表现出完全不一样的行为。 // 从这里可以看到类肯定只是生成一次, 剩下的仅仅只是生成对象, 仅此而已, 所以一般情况下来说并不会有太大的性能影响的。 Subject proxySub2 = (Subject) Proxy.newProxyInstance( Subject.class.getClassLoader(), new Class[] {Subject.class}, new ProxyHandler(sub)); System.out.println(proxySub.getClass() == proxySub2.getClass()); // true }