首页
学习
活动
专区
圈层
工具
发布

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

因为项目的需要,设计了一个满足特定需要的代码自动生成工具。在开发过程中需要根据方法名和方法参数类型数组在指定的类中根据java编译器的规则找到与之最匹配的泛型方法。...,发现java编译器在匹配泛型方法时,对参数的匹配是遵循从左到右的顺序来一个个检查的,根据这个规则写了下面的方法来实现泛型方法的精确匹配。.../** * @param clazz 要搜索的类 * @param name 方法名 * @param parameterTypes 希望匹配的参数类型数组 *...) it.remove(); } if (methods.size() <= 1) //找到唯一匹配的方法或没有匹配的方法就中止循环...it.remove(); } if (methods.size() <= 1) //找到唯一匹配的方法或没有匹配的方法就中止循环

2.3K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    10万行30列数据乘上系数,能快一些吗?含“函数作为参数”的触类旁通方法

    比如说,我们在做转换的时候,虽然只能对一列进行加乘,但是可以对多个列同时做其他处理的,比如更改类型、舍入等等,如下图所示: 小勤:这有什么用啊?...大海:那不是可以拷到文本或word文件里替换然后再拷回来吗?替换后修改参数如下,即将所有的Number.Round(_,2)替换为_*系数: 小勤:好吧,虽然有点儿周折,但也还能接受。...还有更好的办法吗?...,然后做个简单的替换(如0替换为0)以生成公式: 这时,生成的步骤公式如下: 我们只要把其中的Replacer.ReplaceValue参数(数据替换的方法)改掉即可,具体修改如下...大海:这是Table.ReplaceValue中第三个参数(数据替换方法)的使用方式,其中的x是要进行替换的初始值,也就是我们表里的每一个原始内容,y就是我们输入的要查找的值(0),z就是我们要替换为的值

    92720

    反射中Method类的invoke() 和getMethod()

    >… parameterTypes)的作用是获得对象所声明的公开方法 该方法的第一个参数name是要获得方法的名字,第二个参数parameterTypes是按声明顺序标识该方法形参类型。...为String.class 如果对象内的方法的形参是int类型的,则parameterTypes是int.class //getMethod第一个参数是方法名,第二个参数是该方法的参数类型, //因为存在同方法名不同参数这种情况...,所以只有同时指定方法名和参数类型才能唯一确定一个方法 Method method = XXX.getClass().getMethod(methodName,new Class[0]); //第一个参数是具体调用该方法的对象...//如果参数为基本类型数据,必须转换为相应的包装类型的对象。...; //数组类型的参数必须包含在new Object[]{}中,否则会报IllegalArgumentException String[] strings

    1.9K20

    Java 虚拟机:JVM是如何实现反射的?

    其中,Class.forName 会调用本地方法,Class.getMethod 则会遍历该类的公有方法。如果没有匹配到,它还将遍历父类的公有方法。可想而知,这两个操作都非常费时。...在实践中,我们往往会在应用程序中缓存 Class.forName 和 Class.getMethod 的结果。因此,下面我就只关注反射调用本身的性能开销。...由于目标方法 Test.target 接收一个 int 类型的参数,因此我传入 128 作为反射调用的参数,测得的结果约为基准的 2.7 倍。...方法的反射调用会带来不少性能开销,原因主要有三个:变长参数方法导致的 Object 数组,基本类型的自动装箱、拆箱,还有最重要的方法内联。...今天的实践环节,你可以将最后一段代码中 polluteProfile 方法的两个 Method 对象,都改成获取名字为“target”的方法。请问这两个获得的 Method 对象是同一个吗(==)?

    1.8K40

    关于 Java 你不知道的十件事

    不过稍等,Java 文档中关于 Class.getMethod(String, Class…) 这样写道: 请注意,在一个类中会有多个匹配的方法,因为虽然 Java 语法规则禁止一个类中存在多个方法函数签名相同仅仅返回类型不同...这样提高了 JVM 的灵活性以实现各种语言特性。例如,可以用桥接方法(bridge method)来实现方法的协变返回类型,桥接方法和被重载的方法可以有相同的函数签名和不同的返回值类型。...大多数人会认为以下的两个代码片段是等效的: ? 与下边的等效吗? ? 答案是并非如此,我们做个小测试。 ? 是的,在确有必要的情况下,条件表达式会升级数字类型。你希望这个程序抛出一个空指针异常吗?...Java 8 中保留了这个功能,你可以将类型转换为临时的类型交集。这有用吗?几乎没用,但如果你想要将lambda表达式强制转换为这个类型,除此就别无他法了。我们假设你的方法有这个疯狂的类型限制: ?...Lambda 和序列化都有些古怪: Lambda 表达式可以被序列化: 如果一个 lambda 表达式的返回值和输入参数可以被序列化,则这个表达式是可以被序列化的。

    73310

    深入理解代理模式

    Constructor,若类没有无参的Constructor时会出错 Constructor ctr = c.getConstructor(Movable.class); // 可以得到带有参数的构造方法...首先,要实现对任意接口的任意方法代理: 实现代理任意接口: 我们要把接口类型作为参数传给MyProxy的newProxyInstance(Class inface); 代理接口的所有方法: 用inface.getMethods...()取出所有方法,拼接实现方法的字符串(反射); 要实现代理的任意逻辑: 要把代理逻辑抽离,应独立出一个策略接口: MyInvocationHandler接口,并接收被代理的对象及方法作为参数invoke...作为成员遍历放到$MyProxy0中,而且在每一个代理方法内部,要调用被代理对象的原始方法,具体就是下面两行: " Method md = " + inface.getName() + ".class.getMethod...,现在看代码实现: 代码: /** * 能处理任何方法的 调用 只要给我一个Method就能对这个方法进行特殊的处理 * 特殊处理的方式是由子类(实现类)决定 */ public interface

    47740

    阶段01Java基础day26反射

    要想解剖一个类,必须先要获取到该类的字节码文件对象。 而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。...setAccessible(true)设置访问权限,用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值 27.07_反射(通过反射获取方法并使用) Method Class.getMethod...和 Class.getDeclaredMethod(String, Class...)方法可以获取类中的指定方法,调用invoke(Object, Object...)可以调用该方法,Class.getMethod...("eat") invoke(obj) Class.getMethod("eat",int.class) invoke(obj,10) 27.08_反射(通过反射越过泛型检查) A:案例演示 ArrayList...C:案例演示 自己实现枚举类 1,自动拆装箱 2,泛型 3,可变参数 4,静态导入 5,增强for循环 6,互斥锁 7,枚举 27.14_JDK5新特性(通过enum实现枚举类) A:案例演示 通过

    57210

    逆向Java反序列化:从漏洞挖掘者的视角拆解CC1链的发现与构造

    对Tranformer方法进行审计,我们发现,Tranformer方法通过反射机制动态调用传入对象的指定方法(方法名和参数类型由类属性指定),并返回方法的执行结果;如果传入对象为null,则直接返回null...但是有一个问题,TransformedMap类的构造方法修饰符为protected。说明外部无法调用,那么只能通过内部调用。于是我们在本类内部找到了两处调用构造方法的方法。...// 要调用的方法名称new Class[]{String.class, Class[].class}, // 参数类型数组:方法名和参数类型数组new Object[]{"getRuntime", new...Class[]{}}  // 参数值:方法名称"getRuntime"和空的参数类型数组).transform(Runtime.class);             // 在Runtime的Class...要调用的方法名称,即exec方法new Class[]{String.class},          // 参数类型数组,表示exec方法的参数类型为Stringnew Object[]{"calc"

    45910

    代理、反射、注解、hook

    这样就很简单了,黑客们只需要找到开发者在使用EditText控件的getText方法后进行网络验证的方法,Hook该方法,就能劫持到用户的账户与密码了 hook练习 ---- AOP(AspectJ...Class.getMethod(...)还要查找所有的方法。 而注解编译期间就完成了注解的反射工作, jvm只是读取。...反射的缺点 不安全 编译器没法对反射相关的代码做优化 慢的原因还有安全检查,访问控制等。比如说这个方法能不能获得,能不能执行等,传进的参数的类型检查等。...method.getGenericParameterTypes();获取的是方法参数的类型,里面带有实际的参数类型。...method.getParameterAnnotations();获取的是方法参数上面的注解,是一个二维数组,第一个维度代表的是方法参数对应的下标,比如,一个方法有3个参数,那0代表第一个参数,1代表第二个参数

    60450

    Java进阶-反射的详解与应用

    Class.forName(String)方法用于获取类的Class对象;Class.newInstance()方法可以创建类的一个新实例;Class.getMethod()和Class.getField...这里的关键步骤包括获取方法的Method对象,然后使用invoke方法来执行它。getMethod方法的参数是要调用的方法名称,以及一个类对象数组,表示方法的参数类型。...该方法接收两个int类型的参数。然后,使用Method.invoke调用该方法。invoke的第一个参数是要在其上调用方法的对象实例(如果方法是静态的,则为null),后续参数是方法调用的实际参数。...③ 调用泛型方法Java中的泛型信息在运行时是被擦除的,这意味着泛型类型参数在编译后变为它们的边界类型(未指定边界的则变为Object)。因此,直接通过反射调用泛型方法时,通常不需要特别处理类型参数。...反射调用这样的方法时,需要特别注意传递的参数类型。

    1.2K53

    如果你每次面试前都要去背一篇Spring中Bean的生命周期,请看完这篇文章

    究其原因在于,你没有理解为什么需要这些步骤,也不知道为什么要按这个顺序执行 笔者在阅读完整个IOC跟AOP的源码后,希望通过这篇文章讲一讲我的Spring中Bean生命周期的看法,帮助大家能理解性的记忆整个流程...{ // 推测bean的类型,例如在属性注入阶段我们就需要知道符合依赖类型的Bean有哪些 @Nullable default Class的阶段,而应该多思考为什么,这样能帮助你更好的了解这个框架 那么为什么Aware接口非要在初始化前执行呢?...// 第一步:找到这个方法 Method method = class.getMethod(methodName) // 第二步:反射调用这个方法 method.invoke(bean,null)...Bean的生命周期,不过理解是建立在有一定知识存储的基础上的 你至少要对Bean的后置处理器跟Bean创建有一个大概的理解,那么通过本文你能理清一些细节方面的东西 例如,为什么Aware接口执行在初始化阶段之前

    1.2K41

    Java反射介绍

    反射的概述 什么是反射 Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们就可以修改部分类型信息...可以使用Method对象获取方法的信息,包括方法名、修饰符、参数类型和返回类型,并可以调用方法。 Constructor类:表示类中的构造函数。...可以使用Constructor对象获取构造函数的信息,包括修饰符和参数类型,并可以使用构造方法 通过反射获取Class对象 反射获取对象一共有三种方式: 使用Class.forName方法:可以指定类的全限定名...使用Class.getMethod、Class.getDeclaredMethod方法:可以获取指定名称和参数类型的公共方法或所有方法(包括私有方法)。...通过class对象获取到实例对象中的方法对象,参数为方法名,形参类型列表。 为获取的私有方法开访问权限。 通过invork方法调用方法。

    32910

    Java反射机制

    例如它允许一个java的类获取他所有的成员变量和方法并且显示出来。这个能特定我们不常看到,但是在其他的比如C或者C++语言中很不就存在这个特性。...",new Class[]{int.class})这里的display是方法的名字,有一个参数,类型为int Method[] getMethods() 获取所有的公共的方法(public)返回的是一个数组...类型的,需要强制转换 getName() 以字符串的形式返回构造方法的名称,具体的路径包含包名(demo.Test) int getModifiers() 和Class类中的方法一样 Method...null,因为静态方法的调用不需要对象,返回值是Object类型的,如果接受返回值,需要使用强制转换成相应的类型,args是传入的参数,如果有多个参数,那么可以直接在后面用逗号添加或者直接创建数组new...(new Object[]{1000}); test.display(); 成员方法的操作 使用Class.getMethod()和Class.getDeclaredMethod()方法获取方法,

    1.3K40
    领券