使用聚合模式实现静态代理
本质上,动态代理是在程序运行过程中创建生成一个类并且将它加载到JVM中,通过上面的实现步骤,他是把额外的代码(spring中叫切面)植入到被代理类(方法)中以后合成一个类。与静态代理的实现是一样的.
静态代理:在编译时创建代理类。代理类和方法都是固定的。不可改变。
每个代理类都需要实现该接口方法。
1、定义接口
package cn.xiang.proxy; public interface HelloWorld { void sysHello(); }
2、实现接口,被代理类
package cn.xiang.proxy; public class HelloWorldImpl implements HelloWorld{ @Override public void sysHello() { System.out.println("HelloWordImpl --> sysHello() --> start"); System.out.println("HelloWordImpl --> sysHello() --> end"); } }
3、创建代理类
package cn.xiang.proxy; public class HelloWorldProxy implements HelloWorld{ private HelloWorld helloWord; public HelloWorldProxy(HelloWorld helloword) { this.helloWord = helloword; } @Override public void sysHello() { System.out.println("HelloWordproxy sysHello() --> start"); helloWord.sysHello(); System.out.println("HelloWordproxy sysHello() --> end"); } }
4、调用代理类实现静态代理
public class Action { public static void main(String[] args) { new HelloWorldProxy(new HelloWorldImpl2()).sysHello(); } }
动态代理
在运行时动态创建代理对象,对象和方法都不是固定的。
1、创建接口
public interface HelloWorld { void sysHello(); }
2、创建被代理对象,实现接口
public class HelloWorldImpl implements HelloWorld{ @Override public void sysHello() { System.out.println("HelloWordImpl --> sysHello() --> start"); System.out.println("HelloWordImpl --> sysHello() --> end"); } }
3、创建动态代理生成对象。实现InvocationHandler接口
public class HelloWorldProxy implements InvocationHandler{ private HelloWorld helloWord; public HelloWorldProxy(HelloWorld helloword) { this.helloWord = helloword; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("动态生成代理对象--开始"); Object obj = method.invoke(helloWord, args); System.out.println("动态生成代理对象--成功"); return obj; } }
5、动态调用生成动态代理对象,并执行动态方法
public class Action { public static void main(String[] args) { HelloWorldImpl hwi = new HelloWorldImpl(); HelloWorld hw = (HelloWorld) Proxy.newProxyInstance(hwi.getClass().getClassLoader(), hwi.getClass().getInterfaces(), new HelloWorldProxy(hwi)); hw.sysHello(); } }