关于反射小总结

简介:

项目结构图:

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,如需转载请自行联系原作者
相关文章
反射
何为反射?在运行状态时,对于任何一个类,都能够动态获取这个类得所有方法和属性(私有,公有,受保护),都能够调用任意一个方法和属性。
42 0
|
3月前
|
存储 缓存
优美的使用反射,哪些场景推荐使用反射,哪些不推荐使用
优美的使用反射,哪些场景推荐使用反射,哪些不推荐使用
33 0
|
3月前
|
缓存 安全 Java
反射带来的问题
反射带来的问题
35 0
|
安全 数据可视化 IDE
反射(二)什么是反射
反射(二)什么是反射
62 0
|
存储 Java 索引
反射理解
个人对反射的学习理解与代码
68 0
|
设计模式 安全 Java
一起来学反射(下)
一起来学反射
97 0
|
缓存 前端开发 JavaScript
一起来学反射(上)
一起来学反射
100 0
|
Java
简单理解下反射是啥
《基础系列》
104 0
反射小练习
通过反射创建级联对象