Java远程过程调用基础:构建可自适应的动态代理对象的通用方法

[toc]


Java远程过程调用基础:构建可自适应的动态代理对象的通用方法

前言

关于动态代理的知识,这里不再过多说明。这里要介绍的是,如何创建一个可自适应任意接口的动态代理对象的通用方法,也就是说,引用对象可为任意接口,举个例子,假如返回动态代理对象的方法是getProxy,而同时存在两个接口UserInterfaceProductInterface,这时可以这样使用:

UserInterface user = getProxy(UserInterface.class);
ProductInterface product = getProxy(ProductInterface.class);

即不管接口类型是什么,都可以使用getProxy()方法来创建动态代理对象,创建这样一个方法的意义对于构建自己的RPC框架是非常重大的,因为实际可以在getProxy()方法中嵌入远程过程调用客户端的代码,向服务端发出远程调用的请求,以实现远程过程调用的目的。

通用方法getProxy()

代码如下:

    @SuppressWarnings("unchecked")
    public static <T> T getProxy(Class<?> interfaceClass) {
        T proxy = (T) Proxy.newProxyInstance(TestProxy.class.getClassLoader(), new Class<?>[]{interfaceClass}, new InvocationHandler() {

            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                String methodName = method.getName();
                System.out.println("调用的方法名是:" + methodName);
                return null;
            }
        });

        return proxy;
    }

测试

假如这里有两个接口,分别为UserInterfaceProductInterface,代码如下:

UserInterface

package cn.xpleaf.service;

public interface UserInterface {

    public void getUsername();
}

ProductInterface

package cn.xpleaf.service;

public interface ProductInterface {

    public void getProduct();
}

测试代码如下:

    @Test
    public void testGetProxy() {
        UserInterface user = getProxy(UserInterface.class);
        ProductInterface product = getProxy(ProductInterface.class);

        user.getUsername();
        product.getProduct();
    }

输出结果如下:

调用的方法名是:getUsername
调用的方法名是:getProduct

实际应用

后面在进行开发RPC框架时将会充分用到这个通用的方法,在invoke方法中,就可以嵌入我们向服务端发送远程调用请求的代码,从而实现远程调用的目的,而底层通信可以使用socket,当然也可以前面一直在探索的netty,不过出于性能上的考虑,当然会首选netty。

原文地址:http://blog.51cto.com/xpleaf/2074104

时间: 2024-10-23 07:29:20

Java远程过程调用基础:构建可自适应的动态代理对象的通用方法的相关文章

java 反射提取类信息, 动态代理 和过滤某些方法演示

package org.rui.classts.reflects; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.regex.Pattern; /** * 提取 类的 方法 构造器 * @author lenovo * */ //{args:ShowMethods} //查看一个类的所有方法和构造器 public class ShowMethods { private

MyBATIS插件原理第一篇——技术基础(反射和JDK动态代理)(转)

在介绍MyBATIS插件原理前我们需要先学习一下一些基础的知识,否则我们是很难理解MyBATIS的运行原理和插件原理的. MyBATIS最主要的是反射和动态代理技术,让我们首先先熟悉它们. 1:Java反射技术 在Java中反射技术已经大行其道,通过不断的优化性能得到了巨大的提高,而反射技术使得Java的可配置性大大提高.让我们来写一个服务打印hello + 姓名. import java.lang.reflect.InvocationTargetException; import java.l

黑马程序员————java中类的加载、反射、动态代理、枚举

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 类的加载.反射.动态代理.枚举 一.类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 1.加载: 就是指将class文件读入内存,并为之创建一个Class对象 ★★

Java EE开发平台随手记5——Mybatis动态代理接口方式的原生用法

为了说明后续的Mybatis扩展,插播一篇广告,先来简要说明一下Mybatis的一种原生用法,不过先声明:下面说的只是Mybatis的其中一种用法,如需要更深入了解Mybatis,请参考官方文档,或者研读源码. 我们知道,使用Mybatis的方式有很多种,从是否集成上分,可以单独使用,也可以和Spring集成使用:从使用方式上分,可以编写静态工具类,在静态工具中调用SqlSession,也可以直接注入SqlSession/ SqlSessionTemplate,还可以编写Dao接口,让mybat

Java深入浅出系列(四)——深入剖析动态代理--从静态代理到动态代理的演化

静态代理 如上图,在程序执行之前.程序猿就要编写Proxy.然后进行编译,即在程序执行之前,代理类的字节码文件就已经生成了(Proxy类的class文件已经存在了). 静态代理尽管在增强现有的接口业务功能方面有非常大长处,可是大量使用这样的静态代理,会使系统内的类的规模大量增大,不易维护.而且Proxy类和RealSubject类功能本质上是一样的.仅仅只是Proxy起到了一个中介的作用,这样的代理在系统中的存在导致了系统结构的臃肿和松散. 为了解决问题.产生了动态代理.动态代理是在系统执行中,

Java基础-动态代理

在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的. InvocationHandler 每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用

《Java基础知识》动态代理(InvocationHandler)详解

1. 什么是动态代理 对象的执行方法,交给代理来负责.比如user.get() 方法,是User对象亲自去执行.而使用代理则是由proxy去执行get方法. 举例:投资商找明星拍广告,投资商是通过经纪人联系的,经纪人可以帮明星接这个广告,也可以拒绝.做不做,怎么做都叫给经纪人和投资商谈. 2. 实际场景应用 2.1 校验用户权限,每一个菜单请求,都要判断一下请求的用户是否有该菜单权限.菜单多了,代码冗余,且容易遗漏. 通过动态代理就可以实现为:每一个用户,每一个菜单的请求,都经过代理(proxy

java 静态代理 JDK动态代理 Cglib动态代理

下面以一个简单的银行账户为例讲述讲述动态代理. 设计一个银行账户类,包含用户的账户余额,实现查询和更新余额功能 这个系统用了一段时间,有客户要求对账说账户余额给弄错了?因为上面没有存取款记录,最后银行不认账,客户收到了损失.银行为了避免这种现象再次发生,决定对这个系统进行修改,但是因为bankAccount太过复杂,希望在不修改bankAccount的情况下,增加日志功能. 静态代理 使用静态代理解决上面的问题. 银行要求所有模块都需要添加日志功能,这对苦逼的程序员来说真的是一个不小的工作量啊,

【Java入门提高篇】Day11 Java代理——JDK动态代理

今天来看看Java的另一种代理方式--JDK动态代理 我们之前所介绍的代理方式叫静态代理,也就是静态的生成代理对象,而动态代理则是在运行时创建代理对象.动态代理有更强大的拦截请求功能,因为可以获得类的运行时信息,可以根据运行时信息来获得更为强大的执(骚)行(操)力(作). 我们还是以上一个例子为例,这里的IStars接口和Stars类都不需要修改,只需要修改代理类. 创建JDK动态代理需要先实现InvocationHandler接口,并重写其中的invoke方法,具体步骤如下: 1. 创建一个类