静态代理和动态代理
public interface Human {
void sing(float money);
void dance(float money);
}
public class SpringBrother implements Human { //这是要被代理的类
public void sing(float money) {
System.out.println(“拿到钱:”+money+”开始唱”);
}
public void dance(float money) {
System.out.println(“拿到钱:”+money+”开始跳”);
}
}
//经纪人:代理人,完成真正的操作之前做了很多事,如下:
//静态代理
public class ProxyMan implements Human {
private Human h ;
public ProxyMan(Human h){
this.h = h;
}
@Override
public void sing(float money) {
if(money<10000)
throw new RuntimeException(“出场费不能少于10000”);
money=money/2;
h.sing(money);
}
@Override
public void dance(float money) {
if(money<20000)
throw new RuntimeException(“出场费不能少于20000”);
money=money/2;
h.dance(money);
}
}
测试:
public static void main(String[] args) {
Human h = new ProxyMan(new SpringBrother());
h.sing(100000);
h.dance(200000);
以上就是静态代理,很麻烦,要代理人手动加入很多代码。
动态代理,其实就是要实现一个方法InvocationHandler(),完成具体的操作,内部类的实现方式,会拦截调用只要human接口的方法,都会被拦截,都会执行InvocationHandler() 方法,如下:
其他代码不变。
- //动态代理:在内存中生成代理类或代理类的实例
- final Human h = new SpringBrother();//原有对象
- /*
- * newProxyInstance(loader, interfaces, h)
- * loader:代理类使用的类加载器。与被代理对象使用的相同
- * interfaces:代理类实现与被代理类相同的接口。目的,拥有相同的行为
- * h:如何代理?编码指定具体的代理方案(策略设计模式)
- */
- Human pMan = (Human)Proxy.newProxyInstance(h.getClass().getClassLoader(), h.getClass().getInterfaces(), new InvocationHandler() {
- //调用原有类的任何方法都会经过该方法
- /*
- * proxy:代理对象本身的引用
- * method:当前执行的那个方法
- * args:当前方法需要的参数
- * 返回值:当前方法返回的值
- */
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- String methodName = method.getName();// sing dance
- if(“sing”.equals(methodName)){
- float money = (Float)args[0];
- if(money<10000)
- throw new RuntimeException(“出场费不能少于10000”);
- money=money/2;
- return method.invoke(h, money);
- }else if(“dance”.equals(methodName)){
- float money = (Float)args[0];
- if(money<20000)
- throw new RuntimeException(“出场费不能少于20000”);
- money=money/2;
- return method.invoke(h, money);
- }else
- return method.invoke(h, args);
- }
- });
- pMan.sing(100000);
- pMan.dance(200000);
- }