zoukankan      html  css  js  c++  java
  • [改善Java代码]适时选择getDeclaredxxx和getxxx

    Java的Class类提供了很多的getDeclaredxxx方法和getxxx方法,例如getDeclaredmethod和getMethod成对出现,getDeclaredConstructors和getConstructors也是成对出现.

    那这两者有什么区别呢?

     1 import java.lang.reflect.Method;
     2 
     3 public class Client {
     4     public static void main(String[] args) throws Exception {
     5         //方法名称
     6         String methodName = "doStuff";
     7         Method m1 = Foo.class.getDeclaredMethod(methodName);
     8         System.out.println(m1);//输出:void cn.summerchill.test.Client$Foo.doStuff()
     9         Method m2 = Foo.class.getMethod(methodName);
    10         System.out.println(m2);//抛出异常 Exception in thread "main" java.lang.NoSuchMethodException: cn.summerchill.test.Client$Foo.doStuff()
    11 
    12     }
    13     
    14     static class Foo {
    15         void doStuff() {}
    16     }
    17 }

    上面的异常是说m2变量的getMethod方法没有找到doStuff()方法,因为getMethod()方法获得的是所有public访问级别的方法,包括从父类继承的方法.

    而getDeclaredMethod()方法获得的是自身类的所有方法,包括pulbic,private方法等,而且不受限于访问权限.

    Java之所以这么处理,是因为反射本意只是正常代码逻辑的一种补充,而不是让正常代码逻辑产生翻天覆地的变化,所以pulbic的属性和方法最容易获取,私有属性和方法也可以获取,但是要限定本类.

    如果要获得所有继承自父类的方法,如何实现?

    先获得父类,然后使用getDeclaredMethods,之后持续递归即可.

  • 相关阅读:
    Spring、SpringMVC和Springboot的区别(网摘)
    scikit-learn中的主成分分析(PCA)的使用
    便捷的php操作mysql库MysqliDb
    Windows下单机安装Spark开发环境
    在windows上安装scikit-learn开发环境
    Code Igniter + PHP5.3 + SqlServer2008配置
    ubuntu下安装php memcache扩展
    排序——选择排序
    线性回归与梯度下降算法
    ubuntu 允许端口被连接
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/5626119.html
Copyright © 2011-2022 走看看