基于接口的动态代理
来源:互联网 发布:java this.getclass 编辑:程序博客网 时间:2024/05/16 15:27
动态代理:
基于接口的动态代理
java.lang.reflect.Proxy
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
作用:返回代理类的实例
参数:
loader:类加载器,一般与被代理对象使用同一个
interfaces:被代理对象所实现的接口
h:怎么代理
Object invoke(Object proxy, Method method, Object[] args) :调用原有类的任何方法,都会经过此方法。
例:
*******************************************************************************************************
public interface Human {
void sing(float money);
void dance(float money);
}
*******************************************************************************************************
public class Chun implements Human{
@Override
public void sing(float money) {
System.out.println("拿到钱:"+money+"开唱");
}
@Override
public void dance(float money) {
System.out.println("拿到钱:"+money+"开跳");
}
}
*******************************************************************************************************
public class Client {
public static void main(String[] args) {
final Chun c = new Chun();
// 找到春的动态代理类(经纪人)
Human h = (Human)Proxy.newProxyInstance(Chun.class.getClassLoader(),
c.getClass().getInterfaces(), new InvocationHandler(){
@Override // 拦截 proxy: 代理对象的引用 method:当前调用的方法 args:当前方法需要的参数
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 跳舞出场费不能少于30000
if("dance".equals(method.getName())){
float money = (Float)args[0];
if(money>30000){
c.dance(money/2);
}
}
// 唱歌出场费不能少于20000
if("sing".equals(method.getName())){
float money = (Float)args[0];
if(money>20000){
c.sing(money/2);
}
}
return null;
}
});
h.sing(40000);
h.dance(60000);
}
}
*******************************************************************************************************
基于接口的动态代理
java.lang.reflect.Proxy
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
作用:返回代理类的实例
参数:
loader:类加载器,一般与被代理对象使用同一个
interfaces:被代理对象所实现的接口
h:怎么代理
Object invoke(Object proxy, Method method, Object[] args) :调用原有类的任何方法,都会经过此方法。
例:
*******************************************************************************************************
public interface Human {
void sing(float money);
void dance(float money);
}
*******************************************************************************************************
public class Chun implements Human{
@Override
public void sing(float money) {
System.out.println("拿到钱:"+money+"开唱");
}
@Override
public void dance(float money) {
System.out.println("拿到钱:"+money+"开跳");
}
}
*******************************************************************************************************
public class Client {
public static void main(String[] args) {
final Chun c = new Chun();
// 找到春的动态代理类(经纪人)
Human h = (Human)Proxy.newProxyInstance(Chun.class.getClassLoader(),
c.getClass().getInterfaces(), new InvocationHandler(){
@Override // 拦截 proxy: 代理对象的引用 method:当前调用的方法 args:当前方法需要的参数
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 跳舞出场费不能少于30000
if("dance".equals(method.getName())){
float money = (Float)args[0];
if(money>30000){
c.dance(money/2);
}
}
// 唱歌出场费不能少于20000
if("sing".equals(method.getName())){
float money = (Float)args[0];
if(money>20000){
c.sing(money/2);
}
}
return null;
}
});
h.sing(40000);
h.dance(60000);
}
}
*******************************************************************************************************
0 0
- 基于接口的动态代理
- 基于动态代理的javaRMI通信接口封装
- 为什么动态代理只能基于接口?
- 最简单的动态代理实例(spring基于接口代理的AOP原理)
- spring aop学习6:jdk动态代理(基于接口代理)
- 纯接口的动态代理
- JDK动态代理(接口的代理)
- 代理、动态代理、基于模版方法的动态代理
- 基于cglib的动态代理
- 基于JDK动态代理实现的接口链式调用(Fluent Interface)工具
- 设计模式---动态代理(基于JDK的动态代理)
- cglib动态代理[基于类操作的动态代理实现]
- 基于接口动态代理进行事务改造service源码
- 有接口的CGLIB动态代理实现
- MyBatis的Mapper接口动态代理
- 基于动态代理的CharacterEncodingFilter,GzipFilter
- 基于动态代理的CharacterEncodingFilter,GzipFilter
- 基于动态代理的远程服务
- 1325 Is It A Tree?
- UIScrollView
- IOS一些界面刷新思路
- Centos6安装WordPress(二)WordPress安装
- 深入理解ext4
- 基于接口的动态代理
- 【笔记】DOM事件探秘(慕课)
- java参数传递
- falsh屏蔽右键 防止弹出窗口
- 用C#编写Windows服务
- VideoView和SurfaceView视频播放
- python获取堆栈信息的方法
- 模板-多边形与圆的面积交
- HTML 段落