关于反射小总结

简介:

项目结构图:

CC类和SuperCC类是一种继承关系.想通过CC对象访问SuperCC中的方法.而建立一个DD客户端类.

//===============================分隔线一====================================================

CC.java

复制代码
package c;

public class CC extends SuperCC {

}
复制代码

 

SuperCC.java

复制代码
package c;

public class SuperCC {

    public void test() {
        System.out.println("This is SuperCC");
    }
}
复制代码

 

DD.java

复制代码
import java.lang.reflect.Method;

import c.CC;
import c.SuperCC;

public class DD {

    public static void main(String[] args) {
        // CC对象访问SuperCC中的方法
        // 方式一:
        CC cc = new CC();
        cc.test();

        // 方式二:
        try {
            // Method declaredTestMethod = cc.getClass().getDeclaredMethod("test"); 出现异常 java.lang.NoSuchMethodException:c.CC.test()
            Method declaredTestMethod = SuperCC.class.getDeclaredMethod("test"); // 正常打印出"This is SuperCC"
            declaredTestMethod.setAccessible(true);
            declaredTestMethod.invoke(cc);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
复制代码

 解释一下为什么在第一种情况下

cc.getClass().getDeclaredMethod("test");

会出现异常呢?
cc.getClaass 获取的值是 class c.CC
SuperCC.class 获取的值是 class c.SuperCC


如果在CC类中重写SuperCC中的test()方法.
C.java
复制代码
package c;

public class CC extends SuperCC {

    @Override
    public void test() {
        System.out.println("This is CC");
    }
}
复制代码
DD.java
复制代码
import java.lang.reflect.Method;

import c.CC;
import c.SuperCC;

public class DD {

    public static void main(String[] args) {
        // CC对象访问SuperCC中的方法
        // 方式一:
        CC cc = new CC();
        cc.test();

        // 方式二:
        try {
            //Method declaredTestMethod = cc.getClass().getDeclaredMethod("test"); // 正常打印出"This is CC" 
            Method declaredTestMethod = SuperCC.class.getDeclaredMethod("test"); // 正常打印出"This is CC" 
            declaredTestMethod.setAccessible(true);
            declaredTestMethod.invoke(cc);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
复制代码

 这两种方式都会正常打印出"This is CC".

  

 //===============================分隔线二====================================================

再用一下toString()方法

C.java

复制代码
package c;

/**
 * created by kongxiaohan on Jul 21, 2015 Detailled comment
 *
 */
public class CC extends SuperCC {

    @Override
    public String toString() {
        System.out.println("This is CC toString");
        return "CC [toString()=" + super.toString() + "]";
    }
}
复制代码

 

SuperCC.java

复制代码
package c;

public class SuperCC {

    @Override
    public String toString() {
        System.out.println("This is SuperCC toString");
        return "SuperCC [toString()=" + super.toString() + "]";
    }

}
复制代码

 

DD.java

复制代码
package d;

import java.lang.reflect.Method;

import c.CC;
import c.SuperCC;

public class DD {

    public static void main(String[] args) {
        CC cc = new CC();
        try {
            // Method declaredTestMethod = Object.class.getDeclaredMethod("toString"); //正常 但是什么都不打印(也是正常的)
            // Method declaredTestMethod = cc.getClass().getDeclaredMethod("toString"); // 正常 分别打印 This is CC toString  This is SuperCC toString
             Method declaredTestMethod = SuperCC.class.getDeclaredMethod("toString"); // 正常 分别打印 This is CC toString  This is SuperCC toString
            // java.lang.NoSuchMethodException: c.SuperCC.toString()
            declaredTestMethod.setAccessible(true);
            declaredTestMethod.invoke(cc);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
复制代码

 

同样如果以上CC.java中不重写toString()方法.
Method declaredTestMethod = cc.getClass().getDeclaredMethod("toString");是会报java.lang.NoSuchMethodException: c.CC.toString()
Method declaredTestMethod = SuperCC.class.getDeclaredMethod("toString");是正常打印的 This is SuperCC toString
//========================================================分割线三====================================================================



本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/4664764.html,如需转载请自行联系原作者
相关文章
|
JavaScript 索引
【vue】element ui 实现动态表单点击按钮新增行/删除行
【vue】element ui 实现动态表单点击按钮新增行/删除行
3786 0
|
索引 Python 容器
解释Python中的迭代器和生成器的优势和劣势。
解释Python中的迭代器和生成器的优势和劣势。
322 2
|
10月前
|
机器学习/深度学习 数据采集 算法
短视频到底如何推荐的?深度剖析视频算法推送原理详细且专业的解读-优雅草卓伊凡-【01】短视频算法推荐之数据收集
短视频到底如何推荐的?深度剖析视频算法推送原理详细且专业的解读-优雅草卓伊凡-【01】短视频算法推荐之数据收集
1400 12
短视频到底如何推荐的?深度剖析视频算法推送原理详细且专业的解读-优雅草卓伊凡-【01】短视频算法推荐之数据收集
|
11月前
|
人工智能 负载均衡 数据可视化
阿里云百炼免费0元部署DeepSeek-R1满血版,替大家试过了,3分钟部署成功!
阿里云百炼平台提供免费100万Token,一键部署DeepSeek-R1满血版仅需3分钟。新手无需编码,最低0元即可体验。平台支持自动弹性扩展,保障API调用稳定性,并提供Chatbox客户端简化操作流程。详情及教程见阿里云百炼官网。
534 4
|
机器学习/深度学习 并行计算 Java
【java】 vector api 快速入门
【java】 vector api 快速入门
1524 0
|
存储 开发框架 .NET
【博士每天一篇文献-综述】A Comprehensive Survey of Continual Learning Theory, Method and Application
本文综述了持续学习的理论基础、方法论和应用实践,探讨了五种主要的解决策略,包括基于回放、架构、表示、优化和正则化的方法,并深入分析了持续学习的不同场景、分类、评价指标以及面临的挑战和解决方案。
816 1
【博士每天一篇文献-综述】A Comprehensive Survey of Continual Learning Theory, Method and Application
|
开发工具 Android开发 开发者
OpenHarmony与HarmonyOS有什么区别?
如果你对HarmonyOS底层的技术感兴趣,想了解或者想对HarmonyOS做贡献,那么选择OpenHarmony。当然,如果想更进一步,做一款属于自己的操作系统,基于OpenHarmony开源项目做二次开发也是不错的选择哦。
567 1
|
JSON JavaScript 前端开发
以太坊 – 部署智能合约到Ganache
将编译好的智能合约部署到本地的Ganache区块链网络。步骤如下:更新项目的配置文件,修改网络配置连接到本地区块链网络(Ganache)。创建迁移脚本,告诉Truffle如何部署智能合约。运行新创建的迁移脚本,部署智能合约。...
2361 0
以太坊 – 部署智能合约到Ganache
|
Java 数据库连接 API
【Java基础】Java SPI 一 之SPI(Service Provider Interface)进阶& AutoService
【Java基础】Java SPI 一 之SPI(Service Provider Interface)进阶& AutoService
|
Java 程序员 C#
C# 介绍、应用领域、入门、语法、输出和注释详解
C#(发音为“C-Sharp”)是一种由 Microsoft 创建的面向对象的编程语言,运行在 .NET Framework 上。源于 C 家族,与流行的语言如 C++ 和 Java 相近。首个版本发布于 2002 年,而最新版本,C# 12,于 2023 年 11 月发布
417 0

热门文章

最新文章