首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将泛型方法+参数类型+返回类型存储在列表中,以便稍后调用

将泛型方法+参数类型+返回类型存储在列表中,以便稍后调用,可以使用Java中的反射机制来实现。反射是指在运行时动态地获取类的信息并操作类的成员(方法、属性、构造函数等)。下面是一个实现该功能的示例代码:

代码语言:txt
复制
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class GenericMethodStorage {
    private List<MethodInfo<?, ?>> methodList;

    public GenericMethodStorage() {
        methodList = new ArrayList<>();
    }

    public <T, R> void addMethod(Method method) {
        MethodInfo<T, R> methodInfo = new MethodInfo<>(method);
        methodList.add(methodInfo);
    }

    public <T, R> R invokeMethod(int index, T arg) throws Exception {
        MethodInfo<T, R> methodInfo = (MethodInfo<T, R>) methodList.get(index);
        return methodInfo.invoke(arg);
    }

    private static class MethodInfo<T, R> {
        private Method method;

        public MethodInfo(Method method) {
            this.method = method;
        }

        public R invoke(T arg) throws Exception {
            return (R) method.invoke(null, arg);
        }
    }
}

使用示例:

代码语言:txt
复制
public class Main {
    public static void main(String[] args) throws Exception {
        GenericMethodStorage storage = new GenericMethodStorage();

        // 添加方法
        storage.addMethod(Main.class.getMethod("printString", String.class));
        storage.addMethod(Main.class.getMethod("printInteger", Integer.class));

        // 调用方法
        String strResult = storage.invokeMethod(0, "Hello, World!");
        System.out.println(strResult);

        Integer intResult = storage.invokeMethod(1, 123);
        System.out.println(intResult);
    }

    public static void printString(String str) {
        System.out.println("String: " + str);
    }

    public static void printInteger(Integer num) {
        System.out.println("Integer: " + num);
    }
}

该示例代码中,GenericMethodStorage类用于存储泛型方法的信息。通过addMethod方法可以将泛型方法添加到列表中,invokeMethod方法可以根据索引调用相应的泛型方法,并返回结果。

这种方法的优势在于可以动态地存储和调用各种类型的泛型方法,提高了代码的灵活性和可扩展性。适用场景包括但不限于:动态代理、插件化开发、事件处理等。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数计算(云原生无服务器计算服务):https://cloud.tencent.com/product/scf
  • 腾讯云API网关(用于构建、发布、维护、监控和安全管理API):https://cloud.tencent.com/product/apigateway
  • 腾讯云容器服务(基于Kubernetes的容器管理服务):https://cloud.tencent.com/product/tke
  • 腾讯云数据库(提供多种数据库产品,如云数据库MySQL、云数据库Redis等):https://cloud.tencent.com/product/cdb
  • 腾讯云CDN(内容分发网络,加速静态和动态内容的传输):https://cloud.tencent.com/product/cdn
  • 腾讯云安全产品(提供多种安全产品,如Web应用防火墙、DDoS防护等):https://cloud.tencent.com/product/safety
  • 腾讯云音视频处理(提供音视频处理、转码、直播等服务):https://cloud.tencent.com/product/mps
  • 腾讯云人工智能(提供多种人工智能服务,如图像识别、语音识别等):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(提供物联网平台、设备管理、数据采集等服务):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(提供移动应用开发、测试、分发等服务):https://cloud.tencent.com/product/mad
  • 腾讯云对象存储(提供海量、安全、低成本的云存储服务):https://cloud.tencent.com/product/cos
  • 腾讯云区块链(提供区块链服务、区块链托管等):https://cloud.tencent.com/product/baas
  • 腾讯云虚拟专用网络(提供安全、可扩展的云上私有网络):https://cloud.tencent.com/product/vpc
  • 腾讯云云服务器(提供弹性计算服务,如云服务器、弹性伸缩等):https://cloud.tencent.com/product/cvm

请注意,以上链接仅供参考,具体产品选择应根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

根据java编译器规则在Class搜索匹配指定参数类型表的方法(GenericMethod)

开发过程需要根据方法名和方法参数类型数组指定的类根据java编译器的规则找到与之最匹配的方法。...例如,对下面这个类 ,调用test(1,new URL(“http://www.sohu.com“),new Date())会最终调用到哪个方法?...void test(int a,URL b,T c){ } public void test(T1 a,T2 b,T3 c){ } } 于是对java关于方法匹配的方式做了研究...,发现java编译器匹配方法时,对参数的匹配是遵循从左到右的顺序来一个个检查的,根据这个规则写了下面的方法来实现方法的精确匹配。.../** * @param clazz 要搜索的类 * @param name 方法名 * @param parameterTypes 希望匹配的参数类型数组 *

1.6K30

Java 编程思想第十二章 - 容器持有对象

然后整个表达式用括号括起来,以便调用 Apple 的 id() 方法之前,强制执行转型。否则,将会产生语法错误。...尖括号括起来的是类型参数(可能会有多个),指定了这个集合实例可以保存的类型。 通过使用,就可以在编译期防止错误类型的对象放置到集合版本示例 ?...好处 使用,从 List 获取元素无需强制类型转换。因为 List 知道自己持有的啥类型,因此当调用 get() 时,它会替你执行转型。...因此,使用,你不仅知道编译器检查放入集合的对象类型,而且使用集合的对象时也可以获得更清晰的语法。...下的向上转型 当指定了某个类型参数时,并不仅限于只能将确切类型的对象放入集合。 向上转型也可以像作用于其他类型一样作用于: ? ?

1.4K20
  • Java8编程思想精粹(十)-容器(上)

    然后整个表达式用括号括起来,以便调用 Apple 的 id() 方法之前,强制执行转型。 否则,将会产生语法错误。...尖括号括起来的是类型参数(可能会有多个),指定了这个集合实例可以保存的类型。 通过使用,就可以在编译期防止错误类型的对象放置到集合版本示例 ?...好处 使用,从 List 获取元素无需强制类型转换。 因为 List 知道自己持有的啥类型,因此当调用 get() 时,它会替你执行转型。...因此,使用,你不仅知道编译器检查放入集合的对象类型,而且使用集合的对象时也可以获得更清晰的语法。 下的向上转型 当指定了某个类型参数时,并不仅限于只能将确切类型的对象放入集合。...向上转型也可以像作用于其他类型一样作用于: ? ? 因此,可以 Apple 的子类型添加到被指定为保存 Apple 对象的集合

    1.3K41

    C++反射调用.NET(三) 使用非集合的委托方法C++列表对象list C++传递集合数据给.NET创建List实例反射静态方法反射调用索引器当委托遇到协变和逆变C++CLI

    .NET与C++之间传输集合数据 上一篇《C++反射调用.NET(二)》,我们尝试了反射调用一个返回DTO对象的.NET方法,今天来看看如何在.NET与C++之间传输集合数据。...使用非集合的委托方法 先看看.NET类的一个返回列表数据的方法: //返回List或者数组,不影响 C++调用 public List GetUsers(string...,就是传递进来的参数给DTO对象,创建包含10个这样的对象的列表返回而已。...C++端看来,SaveUsers方法参数对象是一个集合,但是具体是什么对象并不知道,所以需要反射出集合的类型,同时还需要构建这样一个集合对象实例。...一切准备就绪,下面可以通过以下步骤提交集合数据给.NET方法了: 1,反射.NET方法,获取参数形参类型; 2,创建此形参的List对象实例; 3,遍历C++集合(列表list),结构数据赋值给动态创建的实体类对象

    9.1K100

    彻底讲清 Java 的(上)

    可以方法参数类型设为基类,这样的方法就可以接受任何派生类作为参数,包括暂时还不存在的类。 这样的方法更通用,应用范围更广。类内部也是如此,在任何使用特定类型的地方,基类意味着更大的灵活性。...的主要目的之一:约定集合要存储什么类型对象,并且通过编译器保证 因此与其使用 Object ,我们更希望先指定一个类型占位符,稍后决定具体使用什么类型。...一般来说,你可以认为和其他类型差不多,只不过它们碰巧有类型参数使用时,只需要指定它们的名称和类型参数列表。 3 一个元组类库 有时一个方法需要能返回多个对象。...而 return 语句只能返回单个对象,解决方法就是创建一个对象,用它打包想要返回的多个对象。 当然,可以每次需要的时候,专门创建一个类来完成这样的工作。 有了,我们就可以一劳永逸。...同时,还获得了编译时的类型安全。 这称为 元组 一组对象直接打包存储于单一对象。可以从该对象读取其中的元素,但不允许向其中存储新对象(这个概念也称为 数据传输对象 或 信使 )。

    63730

    Go语言中常见100问题-#9 Being confused about when to use generics

    不知道什么时候该使用 Go语言1.18版本添加了特性。什么是呢?简单来说,就是编写具有可以稍后指定并在需要时实例化的类型代码。...本文先阐述Go的概念,然后深入讨论常见的使用场景以及使用误区。 下面是从 map[string]int 类型获取所有键的函数....因此,有必要限制类型参数,而不是接受任何类型参数以便类型满足特定要求。在这里,key要具有可比较性(可以使用 == 或 !=). 因此,上面key定义为可比较的类型而不是任何类型。...假设我们创建一个链表,该链表存储的值可以是任意类型,同时有一个Add方法向链表追加一个节点,实现代码如下: type Node[T any] struct { Val T...什么时候建议不要使用呢?下面是一些不推荐使用的场景。 只是单纯调用实参的方法时。例如,下面接收一个io.Writer类型参数调用Write方法的函数。

    46620

    如何使用 Java 来避免 ClassCastException

    允许开发人员List标记为只包含 Double 对象,从而帮助编译器提醒开发人员列表存储非 Double 类型的对象的问题,在编译和开发期间,就把问题解决掉 我们可以这样改造上面的代码: List...也就是说使用过程,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法,分别被称为类、接口、方法。...使用时需要在实例化实际类型参数传递给类型参数 定义的例子 本例子,我们实现一个简易的容器Container,该容器类型存储相应参数类型的对象,使其能够存储各种类型 class Container...参数列表和 printList ()的方法,因为此符号代表任何类型,所以 List 和 List 传递给此方法是合法的 深入探索方法 假如你现在有一个业务逻辑需要你一个...这意味着方法调用期间必须传递相同的实际类型参数,编译器自动通过调用来推断这个参数类型是什么 类型推断 Java 编译器包含类型推断算法,用于实例化类、调用类的构造函数或调用方法时识别实际的类型参数

    2.1K40

    Swift基础 通用

    每种情况下,每当调用函数时,类型参数都会替换为实际类型。(在上面的swapTwoValues(_:_:)示例,第一次调用函数时T替换为Int,第二次调用时替换为String。)...当您扩展类型时,您不会提供类型参数列表作为扩展定义的一部分。...suffix(_:)方法从容器末尾返回给定数量的元素,并将其存储Suffix类型的实例。...您可以作为扩展一部分的where子句中包含多个要求,就像您可以在其他地方编写的where子句一样。用逗号分隔列表的每个要求。...上下文,其中条款 当您已经类型上下文中工作时,您可以编写一个where子句,作为声明的一部分,该声明没有自己的类型约束。例如,您可以类型的下标或类型扩展方法上编写子句。

    10700

    第32项:谨慎地结合和可变参数(Combine generics and varargs judiciously)

    这种转换失败,说明类型安全性已经受到损害,并且一般的可变参数数组存储值是不安全的。    这个例子引出了一个有趣的问题:为什么使用可变参数声明方法是合法的,而显示创建数组是非法的?...换句话说,如果可变参数数组仅用于从调用者向方法传递可变数量的参数——毕竟这是可变参数的目的——那么该方法就是安全的。    值得注意的是,你可以违反类型安全,而无需可变参数数组存储任何内容。...此数组的类型由传递给方法参数在编译时确定类型,编译器可能没有足够的信息来进行准确的确定。因此方法返回其可变参数数组,所以它可以堆污染传播到调用堆栈。    ...你没看到的是编译器pickTwo返回的值上为String []生成了一个隐藏的强制转换,以便它可以存储attributes。转换失败,因为Object []不是String []的子类型。...以下是安全使用可变参数的典型示例。此方法任意数量的list作为参数,并返回包含所有输入list元素的单个列表

    1.4K20

    Swift 进阶:

    扩展一个类型 ---- 当你扩展一个类型时,不需要在扩展的定义中提供类型形式参数列表。原始类型定义的类型形式参数列表扩展体里仍然有效,并且原始类型形式参数列表名称也用于扩展类型形式参数。...为了定义这些要求,Container 协议需要一种不知道容器具体类型的情况下,引用该容器存储的元素类型方法。...suffix(_:) 方法返回容器从后往前给定数量的元素,把它们存储一个 Suffix 类型的实例里。...前两个要求定义了函数的类型形式参数列表里,后两个要求定义了函数的Where 分句中。...这个下标有如下限定: 尖括号形式参数Indices 必须是遵循标准库Sequence 协议的某类型; 下标接收单个形式参数,indices ,它是一个Indices 类型的实例;

    1.7K20

    精:C#这些年来受欢迎的特性

    编者注:学习如何 C# 使用来提高应用程序的可维护性 向.NET Framework引入了类型参数的概念,这使得可以设计类和方法来推迟一个或多个类型的规范,直到类或方法被客户端代码声明和实例化为止...此外,如果添加了值类型,则会发生装箱。这些是您应该注意的性能考虑事项。 解决了这一切,同时也增加了类型安全性。让我们修改前面的例子,包含一个类型参数 T ,并注意方法签名的变化。...更具体地说,它要求类型 'DateTime' 必须是一个引用类型以便将其作为 'T' 参数用于类型或 'Program.DataBag' 方法。...当您使用 async 关键字修改返回方法时,它将使方法主体能够使用await 关键字。评估 await 关键字时,控制流返回调用者,并在该方法的那一点暂停执行。...定义了一个遵循 try-parse 模式的私有委托之后,我们可以编写一个复合方法,它可以传递类型参数、字符串和 tryparse 委托。

    16830

    C# 这些年来受欢迎的特性

    编者注:学习如何 C# 使用来提高应用程序的可维护性 向.NET Framework引入了类型参数的概念,这使得可以设计类和方法来推迟一个或多个类型的规范,直到类或方法被客户端代码声明和实例化为止...此外,如果添加了值类型,则会发生装箱。这些是您应该注意的性能考虑事项。 解决了这一切,同时也增加了类型安全性。让我们修改前面的例子,包含一个类型参数 T ,并注意方法签名的变化。...更具体地说,它要求类型 'DateTime' 必须是一个引用类型以便将其作为 'T' 参数用于类型或 'Program.DataBag' 方法。...当您使用 async 关键字修改返回方法时,它将使方法主体能够使用await 关键字。评估 await 关键字时,控制流返回调用者,并在该方法的那一点暂停执行。...定义了一个遵循 try-parse 模式的私有委托之后,我们可以编写一个复合方法,它可以传递类型参数、字符串和 tryparse 委托。

    19520

    Java是什么?

    调用普通方法时需要传入对应形参数类型的变量(实参),若传入的实参与形参定义的数据类型不匹配,则会报错。...4.2 格式ini 代码解读复制代码[访问权限修饰符][static][final] 返回类型 方法名([形式参数列表]){};4.3 多个类型参数 方法可以定义多个类型参数。...5.1 格式 接口的定义与类类似,接口名后面的尖括号中指定类型参数。这些类型参数可以接口的方法签名、返回类型参数列表中使用。...实现接口时,可以选择指定类型参数的具体类型,或者实现类也定义为类,以便推迟类型参数的指定。...机制的一个重要组成部分,它允许类定义时使用类型参数以便类可以处理不同的数据类型

    13210

    Java之:解读类型安全的利器

    通过使用T来代表类型参数,可以类或方法内部使用该类型。通过实例化类或调用方法时指定具体类型,可以在编译时进行类型检查。这是一个类定义,其中 T 是类型参数。...它表示该类可以接受任意类型参数类的定义,可以使用 T 作为类型参数定义类的各种成员变量、方法或构造函数等。实例化该类时,会指定实际的类型参数来替换 T。...类包含了一个有限制的方法getMax,用于返回一个列表第二个值最大的整数。该方法使用了通配符? extends Comparable来替代具体的数据类型。...最后,我们调用Pair类的静态方法getMax来获取list列表中所有Pair对象的最大值,并将结果保存在一个Integer类型的变量maxPair。最终,我们maxPair打印输出。

    20171

    【Kotlin】DSL 领域特定语言 ( apply 标准库函数分析 | 普通匿名函数 | 扩展匿名函数 | 扩展匿名函数 )

    , this 就是 接收者 “123” 字符串 , 该 Lambda 表达式可以 直接调用字符串的方法 ; 因此 , 调用 println(this) 代码 , 打印 this 就是打印 “123..., 函数类型是 (参数类型列表) -> 返回类型 , 如 : () -> Unit 类型表示是 参数为空 , 返回值也为空的函数 ; () -> String 类型表示是 参数为空 , 返回类型为...,格式为 : fun T.函数名(参数列表): T { 函数体 } 如 : 为 T 添加扩展函数 addStr , 没有参数 , 没有返回值 , 即 返回 Unit 类型返回值 , 代码如下...T.() -> Unit 的匿名函数 , 该 Lambda 表达式 , 可以使用 this 关键字访问接收者 , 可以直接调用接收者的成员属性和成员方法 ; 普通匿名函数 : 如果 传入的是 普通的...匿名函数 , 则在函数 不能使用 this 关键字访问接收者 , 必须将 接收者 作为外部变量进行访问 ; apply 函数参数不是扩展函数类型的假设 如果要 不使用 扩展函数 的 前提下

    70610

    Java基础总结大全(3)

    当使用集合时,集合存储的数据类型作为参数传递到即可 (5)的形式 **类:即自定义类 A:当类要操作的引用数据类型不确定时,早起定义Object来完成扩展,现在定义来完成...B:局限性:类定义的整个类中有效,如果该类的方法调用, 当类的对象明确要操作的类型后,所有要操作的类型就被固定。...**方法放在返回值前面,修饰符的后面 A:为了避免类的局限性,让不同方法可以操作不同的类型,而且类型还不确定, 则可以定义方法上 B:特殊之处:静态方法不可以反问类上定义的...如果静态方法操作的应用数据类型不确定,可以讲定义静态方法上 **接口: 当定义接口上时,则子类要指定实现接口类型,同时还可以子类也可以定义为类 (6)的高级应用:...对于参数化的类型,getClass()方法返回值和原始类型完全一样。

    1.1K70

    深入学习下 TypeScript

    TypeScript 完全支持,以此类型安全性引入到接受参数返回值的组件,这些参数返回值的类型稍后的代码中使用之前是不确定的。...本教程稍后介绍这些结构的每一个,但现在将使用一个函数作为示例来说明的基本语法。要了解有多么有用,假设您有一个 JavaScript 函数,它接受两个参数:一个对象和一个键数组。...如果仔细查看您的函数,您会发现参数列表或 TypeScript 能够推断其值的任何其他地方都没有使用。这意味着调用代码调用您的函数时必须显式传递此类型。...但由于数据类型未知,这段代码无法访问对象的属性。如果您不打算特定类型添加到型函数的每次调用,则可以默认类型添加到类型参数。...使用 NestedOmit ,传入类型,然后列出要省略的属性的键。 请注意如何在第二个类型参数中使用点符号来标识要省略的键。然后结果类型存储 Result

    15310

    go 1.18 系列(1)- 变化说明

    以下是最明显变化的列表 函数 和 类型声明 的语法,现在接受**类型参数** 参数化函数和类型可以通过它们后面加上方括号类型参数列表来实例化 新标记~已添加到一组 操作符和标点符号 接口类型的语法现在允许嵌入任意类型...当前的实现具有以下已知限制: Go 编译器无法处理型函数或方法类型声明,计划在 Go 1.19 取消这个限制。...不允许类型参数或指向类型参数的指针作为结构类型的未命名字段嵌入,同样地,也不允许接口类型嵌入类型参数。 具有多个 term 的 union 元素可能不包含具有非空方法集的接口类型。...P224如果向、P384或方法提供了无效点 P521,则该方法现在返回一个随机点。未来的版本,该行为可能会更改为panic。...为了支持,这里添加了以下东西: 添加了新类型 TypeParam、工厂函数 NewTypeParam和相关方法以表示类型参数。 新类型 TypeParamList包含一个类型参数列表

    2.1K20

    Java基础总结大全(3)

    当使用集合时,集合存储的数据类型作为参数传递到即可 (5)的形式 **类:即自定义类 A:当类要操作的引用数据类型不确定时,早起定义Object来完成扩展,现在定义来完成...B:局限性:类定义的整个类中有效,如果该类的方法调用, 当类的对象明确要操作的类型后,所有要操作的类型就被固定。...**方法放在返回值前面,修饰符的后面 A:为了避免类的局限性,让不同方法可以操作不同的类型,而且类型还不确定, 则可以定义方法上 B:特殊之处:静态方法不可以反问类上定义的...如果静态方法操作的应用数据类型不确定,可以讲定义静态方法上 **接口: 当定义接口上时,则子类要指定实现接口类型,同时还可以子类也可以定义为类 (6)的高级应用:...对于参数化的类型,getClass()方法返回值和原始类型完全一样。

    1.1K100

    深入学习下 TypeScript

    TypeScript 完全支持,以此类型安全性引入到接受参数返回值的组件,这些参数返回值的类型稍后的代码中使用之前是不确定的。...本教程稍后介绍这些结构的每一个,但现在将使用一个函数作为示例来说明的基本语法。 要了解有多么有用,假设您有一个 JavaScript 函数,它接受两个参数:一个对象和一个键数组。...如果仔细查看您的函数,您会发现参数列表或 TypeScript 能够推断其值的任何其他地方都没有使用。这意味着调用代码调用您的函数时必须显式传递此类型。...但由于数据类型未知,这段代码无法访问对象的属性。 如果您不打算特定类型添加到型函数的每次调用,则可以默认类型添加到类型参数。...使用 NestedOmit ,传入类型,然后列出要省略的属性的键。 请注意如何在第二个类型参数中使用点符号来标识要省略的键。然后结果类型存储 Result

    39K30
    领券