博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JDK动态代理实现
阅读量:5898 次
发布时间:2019-06-19

本文共 1786 字,大约阅读时间需要 5 分钟。

创建一个实现类的接口,因为动态代理的本质其实就是代理接口

package com.xiawei.reflect.jdkproxy;

public interface JavaClassDao {

public void say();

}

===========================================

实现上面的借口

package com.xiawei.reflect.jdkproxy;

public class JavaClassDaoImpl implements JavaClassDao{

@Override

public void say() {
System.out.println("这是真实对象的方法!");
}

}

===========================================

创建动态代理类,并让其实现 java.lang.reflect.InvocationHandler接口

package com.xiawei.reflect.jdkproxy;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkProxyClass implements InvocationHandler {

//定义一个真实对
private Object target;
//创建真实对象与代理对象的代理关系,并返回代理对象
public Object bind(Object target){
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
//代理方法逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//在代理方法逻辑中,可以在调用真实对象的方法前执行需要的方法逻辑
System.out.println("在调用真实对象的方法前,执行的方法逻辑!");
//调用真实对象的方法
Object object = method.invoke(target, args);//通过反射执行目标对象的方法[这里相当于target.]
//在代理方法逻辑中,可以在调用真实对象的方法后执行需要的方法逻辑
System.out.println("在调用真实对象的方法后,执行的方法逻辑。");
//在这里,如果调用的真实对象没有返回值,则object为null,否则返回调用对象方法的返回结果
return object;
}

}

===========================================

package com.xiawei.reflect.jdkproxy;

public class Test {

public static void main(String[] args) {

//要调用真实类的方法,就要先创建 代理类对象
JdkProxyClass jpc = new JdkProxyClass();
//然后通过代理类对象的bind()方法获得代理对象(即:绑定关系,因为挂在接口JavaClassDao下面)
//所以申明代理对象JavaClassDao proxy
JavaClassDao proxy = (JavaClassDao) jpc.bind(new JavaClassDaoImpl());
//通过代理对象调用真实类的方法
proxy.say();

}

}

//测试结果:

  在调用真实对象的方法前,执行的方法逻辑!

  这是真实对象的方法!
  在调用真实对象的方法后,执行的方法逻辑。

转载于:https://www.cnblogs.com/xiaweicn/p/8666625.html

你可能感兴趣的文章
Mybatis(一)走进Mybatis与FisrtExample
查看>>
python numpy访问行列元素的方法
查看>>
C++中map用法详解《转》
查看>>
(转)EOSIO开发(四)- nodeos、keosd与cleos
查看>>
Idea代码可视化插件
查看>>
MVC5+EF6 入门完整教程八
查看>>
sql server 无法用sql server身份验证
查看>>
Async和Await 异步方法
查看>>
python 的 json 转换
查看>>
HBase基准性能测试报告
查看>>
软件安装的list(0918)
查看>>
使用quicklz缩小程序体积
查看>>
Java 设计模式专栏
查看>>
在controller中无法通过注解@Value获取到配置文件中定义的值
查看>>
常用Mysql或者PostGresql或者Greenplum的语句总结。
查看>>
用实例讲DynamicResource与StaticResource的区别
查看>>
工控随笔_12_西门子_WinCC的VBS脚本_03_变量类型
查看>>
appium 报错
查看>>
phpquery中文手册
查看>>
微信nickname乱码(emoji)及mysql编码格式设置(utf8mb4)解决的过程
查看>>