使用反射调用超类方法而不使用其实例

2023-12-25

请考虑以下演示继承和反射的代码:

    /*Parent class*/

    package basics;

    public class Vehicle {

        private void parentPrivateMethod() {
            System.out.println("This is the child private method");
        }

        public void print() {
            System.out.println("This is a Vehicle method");
        }

        public void overrideThisMethod() {
            System.out.println("Parent method");
        }

    }


    /*Child class*/

    package basics;

    public class Car extends Vehicle {

        private void childPrivateMethod() {
            System.out.println("This is the child private method");
        }

        public String returnCarName() {
            return "Manza";
        }

        @Override
        public void overrideThisMethod() {
            //super.overrideThisMethod();/*NOTE THIS*/
            System.out.println("Child method");
        }

    }


    /*Tester class*/
    package basics;

    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;

    public class NewTester {

        /**
         * @param args
         * @throws NoSuchMethodException
         * @throws SecurityException
         * @throws InvocationTargetException
         * @throws IllegalAccessException
         * @throws IllegalArgumentException
         * @throws InstantiationException
         */
        public static void main(String[] args) throws SecurityException,
                NoSuchMethodException, IllegalArgumentException,
                IllegalAccessException, InvocationTargetException, InstantiationException {
            // TODO Auto-generated method stub

            Car carInstance = new Car();

            /* Normal method invocation */
            carInstance.overrideThisMethod();

            /* Reflection method invocation */
            Method whichMethod = Car.class.getSuperclass().getMethod(
                    "overrideThisMethod", null);
            whichMethod.invoke(carInstance, null);

            /* Work-around to call the superclass method */
            Method superClassMethod = Car.class.getSuperclass().getMethod(
                    "overrideThisMethod", null);
            superClassMethod.invoke(Car.class.getSuperclass().newInstance(), null);
        }

    }

输出(带有注释的“注意此”部分)是:

        Child method
        Child method
        Parent method

如果“NOTE THIS”部分未注释,将调用超类方法,并给出输出:

        Parent method
        Child method
        Parent method
        Child method
        Parent method

当创建 Car 的实例时,Vehicle 的构造函数首先运行。因此,我相信,也创建了一个 Vehicle 实例,Car 实例通过“super”保存其引用。

Question: 如何在不使用 /* Work-around 调用超类方法 */ 的情况下调用“overrideThisMethod”的超类版本?

我在这里忽略了一些东西/在这里做出了错误的假设吗?


当创建 Car 的实例时,Vehicle 的构造函数首先运行。因此,我相信,也创建了一个 Vehicle 实例,Car 实例通过“super”保存其引用。

这并不完全正确;仅创建一个对象。 Vehicle 的构造函数会运行,因为它是 Vehicle 和 Car 的实例。没有单独的车辆对象,并且super不是对象引用而是关键字。例如你无法通过super以方法作为参数。

The super关键字允许您告诉编译器您想要从超类调用方法,而不检查该方法是否在子类中被重写。为了做到这一点,编译器生成方法调用invokespecialJVM指令。通常编译器会发出一个invokevirtual操作说明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用反射调用超类方法而不使用其实例 的相关文章

  • 正则表达式拆分数字和字母组,不带空格

    如果我有一个像 11E12C108N 这样的字符串 它是字母组和数字组的串联 如何在中间没有分隔符空格字符的情况下分割它们 例如 我希望分割结果为 tokens 0 11 tokens 1 E tokens 2 12 tokens 3 C
  • OSGi:如果不取消服务会发生什么

    这是我获取 OSGi 服务的方式 ServiceReference reference bundleContext getServiceReference Foo class getName Foo foo Foo bundleContex
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • java中如何连接字符串

    这是我的字符串连接代码 StringSecret java public class StringSecret public static void main String args String s new String abc s co
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • Hibernate.createBlob() 方法从 Hibernate 4.0.1 开始已弃用,并移至 Hibernate.getLobCreator(Session session).createBlob()

    Method Hibernate createBlob 已弃用自休眠4 0 1并搬到Hibernate getLobCreator Session session createBlob 任何解决方案我应该在方法内传递什么getLobCrea
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • 匿名类上的 NotSerializedException

    我有一个用于过滤项目的界面 public interface KeyValFilter extends Serializable public static final long serialVersionUID 7069537470113
  • Calendar.getInstance(TimeZone.getTimeZone("UTC")) 不返回 UTC 时间

    我对得到的结果真的很困惑Calendar getInstance TimeZone getTimeZone UTC 方法调用 它返回 IST 时间 这是我使用的代码 Calendar cal Two Calendar getInstance
  • Java 8 流 - 合并共享相同 ID 的对象集合

    我有一系列发票 class Invoice int month BigDecimal amount 我想合并这些发票 这样我每个月都会收到一张发票 金额是本月发票金额的总和 例如 invoice 1 month 1 amount 1000
  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • 我可以创建自定义 java.* 包吗?

    我可以创建一个与预定义包同名的自己的包吗在Java中 比如java lang 如果是这样 结果会怎样 这难道不能让我访问该包的受保护的成员 如果不是 是什么阻止我这样做 No java lang被禁止 安全管理器不允许 自定义 类java
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 调整添加的绘制组件的大小和奇怪的摆动行为

    这个问题困扰了我好几天 我正在制作一个特殊的绘画程序 我制作了一个 JPanel 并添加了使用 Paint 方法绘制的自定义 jComponent 问题是 每当我调整窗口大小时 所有添加的组件都会 消失 或者只是不绘制 因此我最终会得到一个
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • 带有 Maven Wrapper 的 Java 17 导致无法识别的 VM 选项“MaxPermSize=512m”

    I use OpenJDK 17 https jdk java net 17 使用 Maven Wrapper 3 8 2 从春季初始化 https start spring io Maven项目 JAR打包 Java 17 Spring
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import

随机推荐

  • 使用 Paperclip gem 验证上传的附件内容

    Paperclip 具有用于验证文件的存在 大小和内容类型的验证器方法 但有没有办法验证contents保存记录之前的文件 我尝试做validate my method并从以下位置打开文件 attachment path in my met
  • StringBuilder和容量?

    我已经创建了测试应用程序来测试 StringBuilder 是否将数据复制到另一个实例并在其长度超过当前容量时增加其缓冲区并在 ildasm exe 中进行验证 但它看起来相同 如何验证 StringBuilder 将其数据复制到新实例中并
  • 在 ggplotly 中使用 alpha 和手动颜色

    我在设置手动颜色时遇到困难ggplotly library ggplot2 library plotly set seed 1 data frame x 1 10 y rnorm 10 gt ggplot aes x y fill fact
  • Haskell 递归问题,微型解析器。一些东西

    data Expr Var Char Tall Int Sum Expr Expr Mult Expr Expr Neg Expr Let Expr Expr Expr deriving Eq Show 这是数据类型Expr 我有几个问题
  • jquery datepicker 使用两个日期选择器的最大日期最小日期控制

    我所拥有的 我在jquery中有两个日期选择器日历控件 其中第一个只能选择当前日期和上一个日期 但不能选择未来日期 因为我已经编写了运行良好的代码 现在我必须使用另一个带有日期选择器的文本框 它只能选择第一个文本框中选择的日期和当前日期之间
  • 在 ASP.NET MVC 中管理 ADO.NET 实体框架 ObjectContext

    我在 MVC 应用程序中使用 ADO NET EF 我正在考虑将 ObjectContext 放入 HttpContext Current 中 以便同一请求中的所有逻辑都可以访问它 而不必每次都打开 销毁 但是 我真的确定这是否是管理 Ob
  • C 中止陷阱 6 错误

    我有这个代码 void drawInitialNim int num1 int num2 int num3 int board 2 50 make an array with 3 columns int i i j k are loop c
  • 更新 Mapview Xcode 中的位置

    在我当前的项目中 我每次都需要用户的位置50 meter用户移动 所以基本上每次打开申请后50 meter更改我需要用户位置来调用 Web 服务Objective c 我还希望当应用程序处于后台状态时运行相同的进程 提前致谢 您必须在应用程
  • 快速从函数返回多个值

    如何从 swift 中的函数返回 3 个相同类型 Int 的单独数据值 我正在尝试返回一天中的时间 我需要将小时 分钟和秒作为单独的整数返回 但所有这些都来自同一个函数 这可能吗 我想我只是不理解返回多个值的语法 这是我正在使用的代码 我在
  • MySQL OUTER JOIN 语法错误

    也许对你们来说是一个捂脸 但作为一个 SQL 查询新手 我遇到了语法问题 有谁知道出了什么问题吗 SELECT FROM company C OUTER JOIN company address A ON C company id A co
  • 如何在不安装 CPAN 模块的情况下安装它?

    这是我之前问题的后续关于开发 Perl 应用程序 https stackoverflow com questions 1679835 假设我使用 CPAN 模块开发了一个应用程序Module Install 现在我将代码上传到生产服务器 例
  • 自定义包编译选项 R

    我正在构建一个包含旧的包f77绝对应该使用以下代码构建o0优化选项 In the src Makevars在我的包中我添加了这一行 FFLAGS O0 pipe g LTO 但是当我编译我的包时 我看到 R 仍在使用 默认编译选项来自 us
  • SVG上的JS——获取元素的innerHTML

    我想从 SVG 文件中提取一些数据 我知道SVG是XML 所以我想用JS把数据导出来会很容易 所以 我想从 SVG 中提取一堆文本 所以 我启动了 chrome 的 JS 控制台 并尝试做一些事情 我需要得到所有tspan数组中的元素 提取
  • Aurelia js文件上传到服务器

    您好 我是 aurelia js 新手 我需要将文件上传到服务器 我使用 autrelia js materializecss 和 httpClient fetch 进行 api 调用 我不知道如何将文件发送到服务器 view
  • 如何签署使用 PhoneGap Build 构建的 Android APK?

    PhoneGap Build 似乎是一个很棒的工具 我用它构建了一个 apk 并在多个 Android 设备上进行了测试 现在我需要将其提交到 Google Play 商店 但我需要对 apk 进行签名 我已经在 Google 开发者网站上
  • 使用 pecl 在 OS X El Capitan (v10.11.1) 上安装 Mongodb 驱动程序

    我正在尝试为 OS X 安装 php mongo 驱动程序 我尝试过以下操作这些说明 http jafdip com how to install mongodb and the php mongo drive on mac os x sn
  • c# - 读取 HTML?

    我正在用 C 开发一个程序 我需要一些帮助 我正在尝试创建在某个网站上显示的数组或项目列表 我想做的是阅读锚文本 它是href 例如 这是 HTML div class menu 1 div class items div class mi
  • 演员和幕后工作者

    client Client 127 0 0 1 8786 direct to workers True future1 client submit Counter workers ninja actor True counter1 futu
  • 代码分析返回并建议不使用“out”参数

    我针对我创建的对象运行 VS 2008 代码分析工具并收到以下建议 警告 147 CA1021 Microsoft Design 考虑一种不 要求 returnValue 为 out 范围 我发现 out 参数相当有用 但没有意识到它们被认
  • 使用反射调用超类方法而不使用其实例

    请考虑以下演示继承和反射的代码 Parent class package basics public class Vehicle private void parentPrivateMethod System out println Thi