Ejemplo n.º 1
0
  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();
  }
Ejemplo n.º 2
0
  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
  }