关于反射小总结

简介:

项目结构图:

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 实现动态表单点击按钮新增行/删除行
3737 0
|
9月前
|
机器学习/深度学习 数据采集 算法
短视频到底如何推荐的?深度剖析视频算法推送原理详细且专业的解读-优雅草卓伊凡-【01】短视频算法推荐之数据收集
短视频到底如何推荐的?深度剖析视频算法推送原理详细且专业的解读-优雅草卓伊凡-【01】短视频算法推荐之数据收集
1126 12
短视频到底如何推荐的?深度剖析视频算法推送原理详细且专业的解读-优雅草卓伊凡-【01】短视频算法推荐之数据收集
|
SQL 运维 网络安全
【实践】基于Hologres+Flink搭建GitHub实时数据查询
本文介绍了如何利用Flink和Hologres构建GitHub公开事件数据的实时数仓,并对接BI工具实现数据实时分析。流程包括创建VPC、Hologres、OSS、Flink实例,配置Hologres内部表,通过Flink实时写入数据至Hologres,查询实时数据,以及清理资源等步骤。
|
10月前
|
人工智能 负载均衡 数据可视化
阿里云百炼免费0元部署DeepSeek-R1满血版,替大家试过了,3分钟部署成功!
阿里云百炼平台提供免费100万Token,一键部署DeepSeek-R1满血版仅需3分钟。新手无需编码,最低0元即可体验。平台支持自动弹性扩展,保障API调用稳定性,并提供Chatbox客户端简化操作流程。详情及教程见阿里云百炼官网。
473 4
|
机器学习/深度学习 并行计算 Java
【java】 vector api 快速入门
【java】 vector api 快速入门
1398 0
|
12月前
|
网络架构
Next14 页面与布局 使用
Next14 页面与布局 使用
253 7
|
存储 开发框架 .NET
【博士每天一篇文献-综述】A Comprehensive Survey of Continual Learning Theory, Method and Application
本文综述了持续学习的理论基础、方法论和应用实践,探讨了五种主要的解决策略,包括基于回放、架构、表示、优化和正则化的方法,并深入分析了持续学习的不同场景、分类、评价指标以及面临的挑战和解决方案。
713 1
【博士每天一篇文献-综述】A Comprehensive Survey of Continual Learning Theory, Method and Application
阿里云国际版购买了服务器后如何下载发票?
阿里云国际版购买了服务器后如何下载发票?
|
移动开发 前端开发 JavaScript
HTML5 Canvas详解及应用
HTML5 Canvas 允许通过 JavaScript 在网页上动态绘制图形、动画等视觉内容。首先在 HTML 中定义 `<canvas>` 元素,并通过 JavaScript 获取画布上下文进行绘制。常见方法包括绘制矩形、路径、圆形和文本,以及处理图像和创建动画效果。适用于游戏开发、数据可视化、图像编辑和动态图形展示等多种应用场景。需要注意性能优化、无状态绘制及自行处理事件等问题。
|
JSON JavaScript 前端开发
以太坊 – 部署智能合约到Ganache
将编译好的智能合约部署到本地的Ganache区块链网络。步骤如下:更新项目的配置文件,修改网络配置连接到本地区块链网络(Ganache)。创建迁移脚本,告诉Truffle如何部署智能合约。运行新创建的迁移脚本,部署智能合约。...
2288 0
以太坊 – 部署智能合约到Ganache