JAVA 根据类的类型进行动态引用

我的意思是根据实例,引用可以动态改变类型,比如我的对象是不定的,而引用要根据实例改变。听起来不可思议。举个例子把。
我要传一个参数,但是对象是未知的,所以一般来说要用Object对象来作引用。但是Object 对象没有哈希方法和我需要重写equals方法进行对比,默认的Object对象没有我无法比较,但是我可以确定传过去的对象是重写了这两个方法,但是传递过去的对象不定,那么引用必定要Object,没办法所以求教各路高手,本人重写多叉树链表,在进行查找对比的时候遇到了这个问题。

使用java.lang.reflect.Method类中的invoke方法

以下参考 JAVA 1.6 API 文档

invoke
public Object invoke(Object obj,
Object... args)
throws IllegalAccessException,
IllegalArgumentException,
InvocationTargetException

对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。
如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。

如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。

如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在 Java Language Specification, Second Edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。

如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。

如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不 被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。

参数:
obj - 从中调用底层方法的对象
args - 用于方法调用的参数
返回:
使用参数 args 在 obj 上指派该对象所表示方法的结果
抛出:
IllegalAccessException - 如果此 Method 对象强制执行 Java 语言访问控制,并且底层方法是不可访问的。
IllegalArgumentException - 如果该方法是实例方法,且指定对象参数不是声明底层方法的类或接口(或其中的子类或实现程序)的实例;如果实参和形参的数量不相同;如果基本参数的解包转换失败;如果在解包后,无法通过方法调用转换将参数值转换为相应的形参类型。
InvocationTargetException - 如果底层方法抛出异常。
NullPointerException - 如果指定对象为 null,且该方法是一个实例方法。
ExceptionInInitializerError - 如果由此方法引起的初始化失败。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-08-24
放心比较去吧,Java的多态,你没有理解……你这是杞人忧天,调用哪个版本的实例方法,由对象的实际类型决定,所以全用Object引用,调用时都会自动调用对象自己的重写版本。
用Java,这个问题完全不是问题,却被你当成问题,唉~~~~~!本回答被提问者采纳

JAVA 根据类的类型进行动态引用
以下参考 JAVA 1.6 API 文档 invoke public Object invoke(Object obj,Object... args)throws IllegalAccessException,IllegalArgumentException,InvocationTargetException 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方...

binding在Java中得具体作用?
在Java中,`binding`指的是对象实例与实际类型之间的绑定关系,是动态绑定或晚期绑定,意味着Java会在运行时根据对象的实际类型决定调用哪个方法。这种绑定对于实现多态性至关重要。Java中的`binding`主要体现在父类与子类之间。当一个子类对象被赋值给一个基类引用时,基类引用会与子类实例进行绑定。此时,...

Java上转型变量调用子类重写的方法时,方法中调用的属性是被隐藏的还是...
Person person = new Student();在这个例子中,person 是一个 Person 类型的引用变量,但它实际上引用了一个 Student 类型的对象。当你使用这个引用变量调用方法时,将调用子类重写的方法,而不是父类中定义的方法。例如,假设你有一个父类 Person 和一个子类 Student,其中父类有一个方法 getName,...

heap和stack有什么区别 java
Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中,Java用new()语句来显示地告诉编译器,在运行时才根据需要动态创建,因此比较灵活,但缺点是要占用更多的时间。4).每个JVM的线程都有自己的私有的栈空间,随线程创建而创建,java的stack存放的是frames ,java的stack和c的不同,只是存放本地变量,返回...

java的反射机制是什么?
Java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在JavaBean 中广泛应用的一种特性。运用JavaBean 的最常见的问题是:根据指定的类名,类字段名和所对应的数据,得到该类的实例,下面的一个例子演示了这一实现。-|Base.java \/\/抽象基类 |Son1.java \/\/基类扩展1 |Son2.java \/\/基类扩展2 |Util.java...

谈谈你对Java中的多态的理解.(为什么要使用多态,有什么好处,一般用在...
而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。 多态的实现 2.1实现条件 在刚刚开始就提到了继承在为多态的实现做了准备。子类Child继承父类Father,我们可以编写一个指向子类的父类类型引用,该引用既可以处理父类Father对象,也可以处理子类Child对象,当相同的消息发送给子类或者父类对象时...

springboot根据类名获取bean(spring根据类型获取bean)
在SpringBoot用普通类调用Spring管理的Bean1、spring可以自动帮你把Bean里面引用的对象的setter\/getter方法省略,它会自动帮你set\/get。@Autowired注释进行自动注入时,spring容器中匹配的候选Bean数目必须有且仅有一个。2、Thymeleaf是Springboot官方推荐的模板引擎,但仅能渲染htmlxhtml这类型的格式,是实实...

java中多态性什么意思?
多态指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

java中的多态三要素是什么?
之后,如果你调用persion.guitar(),此时在代码的编译阶段,persion调用的仍然是自己的guitar(),不是儿子的。而当程序运行时,就是java XXX, persion调用的却是儿子的guitar()。这个动态的过程才是多态 。总之 比如A a = new B();是创建了一个子类对象并把它当成父类对象A用 也就是父类引用指向...

Java 23 种设计模式的通俗解释,看完秒懂
通过装饰模式为手机内置常用句子,使用时添加MM名字,实现短信发送功能扩展,动态增加功能,支持大量排列组合。门面模式 相机调整至自动模式,MM仅需按快门,门面模式提供统一接口,简化与子系统通信,单例门面类便于使用。享元模式 手机内置常用句子共享,根据上下文发送,减少对象创建,区分内蕴与外蕴状态,...

相似回答