zoukankan      html  css  js  c++  java
  • Java 学习笔记 反射与迭代器

    反射

    使用反射获得Class类

    Class cls = Class.forName("全类名") //包括包名
    Class cls = xx.Class;//xx代表类名
    Class cls = 对象.getClass();
    

    使用反射获得构造方法

    有个构造方法如:

    public Book(String bookName, String author,double price) {
            this.bookName = bookName;
            this.author = author;
            this.price = ((int) price);
        }
    

    在使用反射来获得的构造方法的时候需要与构造方法中的参数类型进行对应

    Constructor declaredConstructor = cls.getDeclaredConstructor(String.class, String.class, double.class);
    //或者使用包装类的静态常量TYPE,表示的是该包装类的基本类型
    Constructor declaredConstructor = cls.getDeclaredConstructor(String.class, String.class, Double.TYPE);
    

    使用反射获得一个对象实例

    例如

    Student student = cls.newInstance();
    

    使用反射获得属性名(字段名,成员变量名)

    以下的方法都是返回Field数组

    • getDeclaredFields()
      返回所有的字段名,但不包括继承的属性名(字段名,成员变量名)
    • getFields()
      返回所有的字段名,包括继承的属性名(字段名,成员变量名)

    使用反射获得方法

    以下两种方法均是返回一个Method数组

    • cls.getMethods()
      包括继承的方法
    • cls.getDeclaredMethods()
      不包括继承的方法
    • cls.getMethod(String name,parameterTypes)
      返回指定方法名的Method,name为方法名,后面参数为该方法的参数列表,参数列表记得按照顺序

    获得类中某个方法的返回类型

    • method.getReturnType()
      返回该方法的返回类型,是一个Class对象(返回类型对应的class)
    //如
    public String hello(){
    	...
    };
    method.getReturnType();//返回的就是java.lang.String
    
    • method.getGenericReturnType()
      返回的是一个Type类对象

    使用反射调用方法

    • method.invoke(Object o...)
      Object是参数列表

    获得类中getXxx方法并调用

    获得所有的字段名,根据字段名拼接成正确的getXxx方法名,之后获得指定方法名的Method,之后调用即可

    Student student = new Student();
    Class<? extends Student> c1 = student.getClass();
    Field[] declaredFields = c1.getDeclaredFields();
    for (Field declaredField : declaredFields) {
    	String name = declaredField.getName();
    	//使用IDEA生成的set/get方法都是遵循驼峰命名法,我们的命名也得按照驼峰命名法
    	//这样,我们只需要把第一个单词的开头字母转为大写的字母即可获得正确的方法名,之后调用即可
    	String a = name.substring(0, 1).toUpperCase();//首字母大写
    	String b = name.substring(1);//截取剩余的字符串
    	Method method = c1.getMethod("get" + a+b);//拼接,并查找匹配的方法
    	method.invoke();
    }
    

    list 迭代器

    listiterator和iterator
    listiterator继承iterator,是iterator的增强版
    listiterator可以双端遍历,通过list.listIterator()方法返回,方法中可以带一个指定下标的数,比iterator要方便

    如果想要从末尾向前找,可以定义迭代器的开始为list的末尾,之后往前查找

    ListIterator listIteratorlists.listIterator(lists.size());
    while (listIterator.hasPrevious()) {
        System.out.println(listIterator.previous());
    }
    
  • 相关阅读:
    定义模块与增加模块中的测试代码
    20150412自省
    Python中暂未解决的问题
    Node基础_文件系统
    Node基础_Buffer缓冲区
    Node基础_npm简介
    Node基础_模块化简介及详解
    Node基础_node简介
    Nosql_Mongoose简介及操作
    Nosql_MongoDB简单的查询练习
  • 原文地址:https://www.cnblogs.com/stars-one/p/10617400.html
Copyright © 2011-2022 走看看