Method.getParameterAnnotations()研究

在Java的反射中,通常需要获取方法参数上的注解,那么:
1,先拿到对象的Class对象.
2,然后找到某个方法的反射对象Method
3,然后再用Method的获取参数注解.

Annotation[][] annos = method.getParameterAnnotations();

得到的结果是一个二维数组.
那么这个二维数组是怎么排列组合的呢?
首先举个例子:
    @RedisScan
    public void save(@RedisSave()int id,@RedisSave()String name){

    }

第一个参数下表为0,第二个为1

也就是说:annos[0][0] = RedisSave
               annos[1][0] = RedisSave
也就是说,二维数组是包含多个仅有一个值的数组.

因为参数前可以添加多个注解,所以是二维数组,一个参数上不可以添加相同的注解,同一个注解
可以加在不同的参数上!
### 关于 RPC 注解的使用方法及介绍 #### 1. 基本概念 RPC(Remote Procedure Call)是一种允许程序调用另一台计算机上的子程序的技术。为了简化开发流程并增强功能扩展性,许多现代框架提供了基于注解的方式实现服务注册、发现以及远程调用的功能。 以下是常见的 RPC 相关注解及其作用: --- #### 2. Dolphinscheduler 的 `@RpcService` 和 `@RpcMethod` 在 DolphinScheduler 中,`@RpcService` 是用于标记提供远程服务的类[^1]。它通常被放置在一个实现了特定接口的服务类之上,表示该类是一个可以暴露给客户端访问的远程服务。 - **`@RpcService`** - 功能:标注某个类为可远程调用的服务端实现。 - 使用场景:当开发者希望将某个 Java 接口的具体实现暴露出供其他节点调用时,可以在其实现类上加上此注解。 示例代码如下: ```java @RpcService public class MyServiceImpl implements MyService { @Override public String sayHello(String name) { return "Hello, " + name; } } ``` - **`@RpcMethod`** - 功能:进一步细化控制哪些具体的方法可以通过 RPC 协议被外部调用。 - 默认情况下,如果未显式声明,则整个接口的所有公开方法都会被认为是可用的。 --- #### 3. 自定义 `@RpcReference` 注解 某些框架还支持通过自定义注解完成依赖注入操作。例如,在 Spring 容器中利用 Bean 生命周期处理器 (`BeanPostProcessor`) 来动态处理带有特殊标签的对象实例化过程[^2]。 - **工作原理**: 当应用程序启动期间遇到任何带有此类标志的目标字段时,系统便会触发相应的初始化动作——即创建对应的代理对象并与实际远端实体建立连接关系。 - **示例代码**: 下面展示了一个简单的例子说明如何结合 AOP 技术构建这样的机制。 ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface RpcReference { Class<?> interfaceClass() default Object.class; // 对应的服务接口类型 String version() default ""; // 可选参数版本号区分不同实现 } // 配合Spring容器使用的后置处理器 public class RpcReferenceBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter { private final Map<String, Object> serviceMap; public RpcReferenceBeanPostProcessor(Map<String, Object> serviceMap) { this.serviceMap = serviceMap; } @Override public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException { for (PropertyDescriptor pd : pds) { Method writeMethod = pd.getWriteMethod(); if (writeMethod != null && writeMethod.getParameterCount() == 1 && writeMethod.getParameterTypes()[0].isAnnotationPresent(RpcReference.class)) { try { RpcReference rpcRefAnno = writeMethod.getParameterAnnotations()[0][0]; String serviceName = rpcRefAnno.interfaceClass().getName(); Object proxyInstance = createProxy(serviceName); ReflectionUtils.invokeMethod(writeMethod, bean, proxyInstance); } catch (Throwable t) { throw new RuntimeException(t.getMessage(), t); } } } return pvs; } private Object createProxy(String serviceName){ return Proxy.newProxyInstance( getClass().getClassLoader(), new Class[]{Class.forName(serviceName)}, (proxy, method, args) -> invokeRemote(method.getName(), args)); } private Object invokeRemote(String methodName, Object[] params)throws Throwable{ System.out.println("Invoking remote method: "+methodName+", Params:"+ Arrays.toString(params)); // Simulate network call here... return "Response from server"; } } ``` --- #### 4. Dubbo 框架下的 `@Reference` 注解 作为阿里巴巴开源的一个高性能 Java RPC 框架,Dubbo 提供了自己的专属解决方案来解决跨进程间通信需求问题之一就是其独特的消费者侧绑定手段—`@Reference`[^4]。 - **特点对比**: 不同于传统意义上的 DI 方式(比如 Spring Framework 内建的支持),这里不再单纯依靠本地内存空间内的查找定位目标组件位置;而是借助网络传输协议向预设好的地址发起请求获取真实的数据结构体代表。 - **典型应用模式**: 在 Controller 层级可以直接引入所需后台逻辑单元而无需额外关心底层细节部分。 ```java import com.alibaba.dubbo.config.annotation.Reference; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class DemoController { @Reference(version = "${demo.service.version}", timeout=5000L) private DemoService demoService; @GetMapping("/hello") public String hello(){ return demoService.sayHello("World"); } } ``` --- #### 5. 总结 无论是 DolphinScheduler 的 `@RpcService/@RpcMethod` 组合还是 Dubbo 的 `@Reference` 设计思路都体现了当前主流技术栈对于微服务体系架构下高效协作的需求满足能力。前者更倾向于内部调度管理领域优化改进方向探索实践成果体现;后者则侧重于大规模分布式环境下面临挑战应对策略研究分享价值所在之处展现出来。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值