Java动态代理实现接口方法
来源:互联网 发布:怎么加雷盾网络验证 编辑:程序博客网 时间:2024/05/01 21:37
最近正在看Mybatis源码,重点研究了自定义Mapper接口里方法实现如何与xml配置文件进行绑定,最后了解到是通过java动态代理实现了接口方法。
主要使用了Proxy.newProxyInstance(loader, interfaces, invocationHandler方法来实现实例化,第一个参数为classLoader,第二个参数为要实例化的接口,第三个是InvocationHanler接口,需要实现此接口来实现方法的具体操作。例:
public void proxyTest() throws ClassNotFoundException,InstantiationException, IllegalAccessException {MethodProxy invocationHandler = new MethodProxy();Object newProxyInstance = Proxy.newProxyInstance(IUserService.class.getClassLoader(),new Class[] { IUserService.class }, invocationHandler);IUserService userService = (IUserService) newProxyInstance;User query = userService.query();System.out.println("query result->" + query.toString());}执行结果:
具体代码实现如下(仅为了说明实现方式,请忽略结构层次和命名规范):
public class MethodProxy implements InvocationHandler {@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stubSystem.out.println("执行前");if (Object.class.equals(method.getDeclaringClass())) {try {return method.invoke(this, args);} catch (Throwable t) {t.printStackTrace();}} else {//System.out.println("调用方法名:"+method.getName());return run(method, args);}System.out.println("执行后");return null;}UserDao dao = null;//具体实现通过方法名绑定。public Object run(Method method,Object[] args){if(dao == null){dao = new UserDao();}Object ret = null;String name = method.getName();if(name.equals("add")){dao.add(args);}else if(name.equals("delete")){dao.delete();}else if(name.equals("query")){ret = dao.query();}return ret;}class UserDao {public void add(Object[] args){System.out.println("dao add");for (Object object : args) {System.out.print(object+",");}}public void delete(){System.out.println("dao delete");}public User query(){return new User("123", "济南", 22, "备注");}}}
public interface IUserService {public void add(User user);public User query();public void delete(int id);}
public class User {private String id;private String username;private int age;private String remarks;public User(String id, String username, int age, String remarks) {super();this.id = id;this.username = username;this.age = age;this.remarks = remarks;} …… @Override public String toString() { return "User [id=" + id + ", username=" + username + ", age=" + age + ", remarks=" + remarks + "]"; }}本demo所展示的是具体接口的实现方法,为保证通用性,则可通过泛型实现接口实例化的通用方法。 (参考mybatis-src)
例地:
0 0
- Java动态代理实现接口方法
- JAVA动态代理实现方法
- Java动态代理实现接口invocationHandler
- java中动态代理模实现接口
- java动态代理--代理接口无实现类
- java动态代理--代理接口无实现类
- java动态代理--代理接口无实现类
- Java动态代理的实现方法
- java动态代理2 (cglib 不用实现接口)
- Java动态代理实现
- Java动态代理实现
- JAVA动态代理实现
- Java 动态代理实现
- Java动态代理实现
- Java动态代理实现
- Java动态代理实现
- Java动态代理实现
- Java动态代理实现
- 机器学习初探———【K-近邻算法】
- Android源码分析-资源加载机制
- PHP数组下标加引号的理解
- 360急速浏览器有道词典屏幕取词问题
- 你所不知道的Html5那些事(一)
- Java动态代理实现接口方法
- iptables的详细介绍及配置方法
- 检测网络状态
- 关于Mongodb的全面总结,学习mongodb的人,可以从这里开始!
- HomeKit 开发指南(中文版)
- 静态变量和全局变量的区别
- C语言中memset参数
- 排列组合数C(m,n)的O(n)算法
- 关于static和final