JDK动态代理有以下特点:
1.代理对象,不需要实现接口
2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
3.动态代理也叫做:JDK代理,接口代理 4.动态代理要求目标对象一定要实现接口,所以也叫做接口代理!
接口: | /**
* 明星接口:定义规范,约定的作用。
*/
public interface IStar {
/**
* 唱歌
*/
void singing(double money);
/**
* 拍戏
*/
void play(double money);
} | | /**
* 明星刘德华,是目标对象
*/
public class LiuDeHuaStar implements IStar {
@Override
public void singing(double money) {
System.out.println("谢霆锋唱歌一级棒,收费标准:"+money);
}
@Override
public void play(double money) {
System.out.println("谢霆锋拍戏棒棒滴,收费标准:"+money);
}
} | 代理
public class App {
public static void main(String[] args) {
// 0.目标对象
IStar target = new LiuDeHuaStar();
// 1.对目标对象生成代理对象
IStar proxy = (IStar) Proxy.newProxyInstance(
//参数1:类加载器(默认)
target.getClass().getClassLoader(),
//参数2:目标对象实现的接口类型数组
target.getClass().getInterfaces(),
//参数3:事件处理程序(执行代理对象方法时候会触发这里)
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//获取方法参数
Double money = (Double) args[0];
// 判断
if(money > 100000){
// 执行目标对象方法
return method.invoke(target,args);
} else {
// 不执行目标对象方法,提示
System.out.println("档期忙,后期再合作!");
return null;
}
}
}
);
System.out.println(proxy.getClass());
// 2.调用代理对象的方法
proxy.play(10);
}
}
|