题目比较绕。以下用一个简单的例子说明:
public class A
{
@Override
public String toString()
{
return "A";
}
public static void main(String[] args)
{
A a = new A();
B b = new B();
System.out.println(a.toString());
System.out.println(b.toString());
}
}
class B
{
}
执行之后效果如下:
A
B@c17164
代码中,A的toString方法重写(override)了Object类的原始方法。
现在希望能够有方案对A对象调用Object类的toString方法从而获得A的索引值(reference)。
尝试一,反射,失败。
import java.lang.reflect.Method;
public class A
{
public String toString()
{
return "A";
}
public static void main(String[] args) throws Exception
{
A a = new A();
Method m = Object.class.getMethod("toString");
System.out.println(m.invoke(a));
}
}
尝试二,研究super关键字的用法,发现没有类似于
a.super.toString()这样的写法,失败。
从而得出基本结论,采用编写代码的方式很难达到效果。
不过以下方法绕过了代码的语法规则和编译器的检查。可以达到要求的效果:
- 把编写好的Java代码通过编译器生成类文件。
- 使用Java ByteCode Editor打开生成的类文件。
- 找到 invokevirtual A/toString()Ljava/lang/String;
- 修改为 invokespecial java/lang/Object/toString()Ljava/lang/String;
- 保存,执行,检查效果。
A@11b86e7
invokespecial这个OpCode只有在以下三种情况下才能写出来:
- 生成某个类的实例对象。
- 在类的内部调用超类方法。
- 在类的内部调用私有方法。
因此如果不是手动修改ByteCode,似乎没什么办法实现以上的需求。
分享到:
相关推荐
如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问,但是该方法或属性在子类中并不存在,那么就会自动的去其父类中进行查找。 继承父类后,就能调用父类方法和访问父类属性,而要完成整个集成...
php实现在子类中调用父类的方法,这个和平常的调用父类是不一样的,希望你们能有收获
JS在子类中用Object.getPrototypeOf去调用父类方法,是一个很好的js模板
本文实例讲述了C#中实现子类调用父类的方法,分享给大家供大家参考之用。具体方法如下: 一、通过子类无参构造函数创建子类实例 创建父类Person和子类Student。 public class Person { public Person() { ...
NDK开发之C语言调用Java构造方法、父类方法、返回中文字符串乱码问题案例详细解析。
c++里,指针和引用是很重要的概念,这个程序不仅对指针和引用做了说明、使用,而且对子类不能继承父类虚函数也做了说明。
本代码为MFCDLL导出类技术调查程序, 程序通过静态DLL导出基类BaseClass和其子类SubClass, 并通过MFC应用程序UseDll.exe调用子类SubClass中的方法 和其继承发父类中的方法,输出相应的值。
如果一个类继承一个父类,那么子类会拥有父类所规定的所以成员 子类还可以拥有父类没有的独有成员 父类可以完成的任务,子类对象也可以完成 子类可以调用父类Person p= new ...//说明不可以调用子类的方法,还是父类
Java的子类调用父类的构造方法.pdf
主要介绍了Java父类调用子类的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
9.15_子类方法调用父类方法super关键字|高级部分_面向对象|Python3.8入门_&_进阶_&_原生爬虫实战完全解读
通过java类的路径实例化类并调用方法:仅仅知道类的路径,就可以实例化对象,利用反射机制调用其方法
WPF继承_子类继承父类,实现跨类调用方法
本文主要给大家介绍了关于python子类调用父类函数的相关内容,Python中子类中的__init__()函数会覆盖父类的函数,一些情况往往需要在子类里调用父类函数。下面话不多说了,来一起看看详细的介绍: 如下例程里,??...
调用父类构造函数,对应文件:ClassElement2,文章:https://blog.csdn.net/yysyangyangyangshan/article/details/84311848
C++中,一个类需要调用另外一个类的数据成员时,经常不知道怎么做,这里整理了两种方法,来实现在一个类中调用另外一个类的数据成员。
子类调用抽象父类,并强制子类重写父类的抽象属性,然后调用父类的方法输出
C++,C 包含类两个类互相调用彼此的类成员变量和方法,里面介绍了如何在头文件中创建相互的类对象,简单易懂
构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统...