博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于反射小总结
阅读量:6961 次
发布时间:2019-06-27

本文共 3734 字,大约阅读时间需要 12 分钟。

我之前总结的关于反射的另一篇文章:

项目结构图:

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
//========================================================分割线三====================================================================

 
 

 

转载地址:http://ibwsl.baihongyu.com/

你可能感兴趣的文章
H5本地存储一
查看>>
LinuxMBR修复,引导修复。
查看>>
2016年上半年系统集成中项3月28日作业
查看>>
Redhat6.5(红帽6.5)配置yum本地源
查看>>
Unity3D动画存储插件
查看>>
awk:Nagios流量监控插件
查看>>
ipsec ***
查看>>
Ceph心跳与网络
查看>>
zabbix server 数据库迁移
查看>>
对接新通道的分析处理
查看>>
Linux01-bash脚本编程之七case语句及脚本选项进阶27
查看>>
Java记录 -11- 面向对象之封装续II
查看>>
Sybase Anywhere 8.0 DB数据库文件损坏的恢复
查看>>
hashMap理解
查看>>
ruby升级到1.9
查看>>
job.properties
查看>>
watchdog的加载方法
查看>>
我的友情链接
查看>>
C语言基础之类型系统
查看>>
jenkins+docker+nodejs项目的自动部署环境
查看>>