zoukankan      html  css  js  c++  java
  • 关于反射小总结

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

    http://www.cnblogs.com/DreamDrive/p/4217130.html

    项目结构图:

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







  • 相关阅读:
    (mysql)卸载5.0安装6.05出现“Error Nr. 2003 : Can't connect to MySQL server on 'localhost' (10061). ”的解决办法
    (Redundancy)关于服务器冗余的几个疑问,请知道的帮忙解答.
    (C#)XML文件操作3
    POJ 3635 Full Tank(最短路径变形 + 优先队列)
    POJ 2286 The Rotation Game(DFS + 迭代加深)
    POJ 1141 Brackets Sequence(区间DP + 打印路径)
    POJ 3460 Booksort(IDA* + 估价函数设计)
    POJ 2908 Quantum(BFS + 优先队列)
    NOI 1997 积木游戏(解题报告)
    NYOJ 110 决斗(区间DP + 黑书例题)
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/4664764.html
Copyright © 2011-2022 走看看