package com.lcj.dongtaidaili;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class 动态代理 {
/**
* 动态代理:
* 最明显的功能就是可以实现方法过滤,从而在需要的方法上添加上额外功能
*
* @author aniu520
*
*/
interface 演员{
public void 演电影();
public void 签合同();
}
public static class 范冰冰 implements 演员{
public void 演电影(){
System.out.println("范冰冰 演");
}
public void 签合同(){
System.out.println("范冰冰 签");
}
}
public static void main(String [] args){
//内部类使用的变量需要final修饰
final 范冰冰 fan = new 范冰冰();
System.out.println("-----没有代理之前-----");
fan.演电影();
fan.签合同();
演员 fanDaili = (演员)Proxy.newProxyInstance(fan.getClass().getClassLoader(), fan.getClass().getInterfaces(), new InvocationHandler(){
//传入的借口方法,都会被此方法过滤,也叫代理
@Override
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
//如果是签合同,代理帮签也可以
if("签合同".equals(method.getName())){
System.out.println("代理帮范冰冰 签合同");
return null;
}else{
return method.invoke(fan,args);
}
}
});
System.out.println("-----有代理后-----");
fanDaili.演电影();
fanDaili.签合同();
}
}
/*
-----没有代理之前-----
范冰冰 演
范冰冰 签
-----有代理后-----
范冰冰 演
代理帮范冰冰 签合同
*/
动态代理应用场景 Java
最新推荐文章于 2024-08-11 15:27:43 发布