当前位置 : 主页 > 编程语言 > java >

《Java 核心技术 卷1》 笔记 第五章 继承(11)反射泛型数组+方法指针+类设计技

来源:互联网 收集:自由互联 发布时间:2022-07-14
5.7.5 使用反射编写泛型数组方法 扩展数组 空的不扩展 非数组不扩展 getComponentType获取类型 Array.newInstance创建新数组 复制数组元素 public class Main { public static void main ( String [] args ) throw


5.7.5 使用反射编写泛型数组方法

扩展数组

  • 空的不扩展
  • 非数组不扩展
  • getComponentType获取类型
  • Array.newInstance创建新数组
  • 复制数组元素
  • public class Main {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {

    Main solution = new Main();

    int[] item = new int[5];

    for(int i = 0; i < 5; i++){

    item[i]=i;

    }

    int[] copyGrow = (int[]) Test.growArray(item);

    System.out.println(Arrays.toString(copyGrow));

    }



    static class Test{

    public static Object growArray(Object arrayObj){

    if(arrayObj==null)

    return arrayObj;

    Class c = arrayObj.getClass();

    if(!c.isArray())

    return null;

    Class type = c.getComponentType();

    int len = Array.getLength(arrayObj);

    final int SIZE = len*2+1;//加1防止原本是0

    Object newArr = Array.newInstance(type,SIZE);

    System.arraycopy(arrayObj,0,newArr,0,len);

    return newArr;

    }

    }

    }

    5.7.6 方法指针

    Method m = xx.getClass().getMethod("方法名");

    Method m = xx.getClass().getMethod("方法名",参数1类型,参数2类型);//提供所有参数类型,因为存在方法重载,需要通过参数来找到对应内容

    静态方法调用:

    Method 静态方法 = 类名.class.getMethod("方法名",参数.class…);

    静态方法.invoke(null,参数…);

    普通方法调用:

    Method 普通方法 = obj.getClass().getMethod("方法名",参数.class…);

    普通方法.invoke(obj,参数…);

    public class MethodPointerTest {

    public static void main(String[] args) throws Exception{

    Method square = MethodPointerTest.class.getMethod("square",double.class);

    Method sqrt = Math.class.getMethod("sqrt",double.class);

    printTable(1,10,10,square);

    printTable(1,10,10,sqrt);

    }



    public static double square(double x){

    return x*x;

    }



    public static void printTable(double from,double to, int n,Method f){

    System.out.println(f);



    double dx = (to-from)/(n-1);

    for(double x = from; x<=to; x+=dx){

    try {

    double y = (Double) f.invoke(null,x);

    System.out.printf("%10.4f|%10.4f%n",x,y);

    }catch (Exception e){

    e.printStackTrace();

    }

    }

    }

    }

    《Java 核心技术 卷1》 笔记 第五章 继承(11)反射泛型数组+方法指针+类设计技巧_核心技术

    作者建议:不用少用Method对象回调功能,对于Java来说,使用接口更好

    5.8 继承设计和技巧

  • 公共操作和全局变量放在父类,增加代码复用性
  • 不要使用受保护的全局变量(想想真的很少用到),受保护的方法反而常用一些
  • 使用继承实现is-a,like-a 关系慎用,其实说起来简单,实际上 like-a 给两者加共同父类实现 is-a,还是直接建立新的类,是一种不太好做出的取舍。不知道怎么做的时候,试着用公共接口吧。
  • 除非所有继承的方法都有意义,否则不要使用继承。这句话个人认为理论看似很对,实际上写的时候,你会发现不那么对。因为有可能一开始已经有继承关系了。然后才发现,90%的子类有共性,所以添加了公共父方法,把子类方法挪到了父类,减少后续代码重复。能用接口写吗?不太好。接口只有较新版本接受接口内有方法体,Android手机用户老版本使用者一安装就崩溃,兼容性会比较差。
  • 覆盖方法,不要改变预期行为。只能说尽力。你很难保证,自己的甲方不会出一个奇葩的需求,再一个,不是每个代码的接收者都能拿到程序的代码。
  • 使用多态而非类信息。如果一开始已经既定要使用多态,那就使用多态的对应的类型来判断吧。但是多态会损失子类方法,例子如下:
  • import java.util.Set;

    import java.util.TreeSet;



    public class MethodPointerTest {

    public static void main(String[] args) throws Exception{

    TreeSet<Integer> set = new TreeSet<>();

    set.add(1);

    System.out.println(set.first());

    Set<Integer> set2 = new TreeSet<>();

    set2.add(1);

    System.out.println(set2.first());

    }

    }

    《Java 核心技术 卷1》 笔记 第五章 继承(11)反射泛型数组+方法指针+类设计技巧_java_02

    7. 不要过多地使用反射。确切地说,初学者、非框架级别后端程序员都要少写反射,往往是一些公共且困难复杂地代码才会用反射,平时做增删改查操作几乎用不到。

       系列内容:

    《Java 核心技术 卷1》 笔记:第一章 Java程序设计概述

    《Java 核心技术 卷1》 笔记:第二章 Java程序设计环境

    《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(1)

    《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(2)

    《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(3)

    《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(4)

    《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(5)

    《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(6)

    《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(7)大数处理、数组、多维数组、控制台传参

    《Java 核心技术 卷1》 笔记 第四章:类与对象

    《Java 核心技术 卷1》 笔记 第四章:类与对象(2) GregorianCalendar 与 类的基本组成

    《Java 核心技术 卷1》 笔记 第四章:类与对象(3) 构造器全局私有方法

    《Java 核心技术 卷1》 笔记 第四章:类与对象(4) 静态字段+静态方法+工厂方法

    《Java 核心技术 卷1》 笔记 第四章:类与对象(5) 形参与实参 构造器的默认值与默认构造

    《Java 核心技术 卷1》 笔记 第四章:类与对象(6) 构造器调用与初始化块

    《Java 核心技术 卷1》 笔记 第四章:类与对象(7) 注释、JavaDoc与类设计

    《Java 核心技术 卷1》 笔记 第五章 继承

    《Java 核心技术 卷1》 笔记 第五章 继承(2)

    《Java 核心技术 卷1》 笔记 第五章 继承(3)

    《Java 核心技术 卷1》 笔记 第五章 继承(4)equals方法

    《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString

    《Java 核心技术 卷1》 笔记 第五章 继承(6) 泛型

    《Java 核心技术 卷1》 笔记 第五章 继承(7) 包装类和可变数组

    《Java 核心技术 卷1》 笔记 第五章 继承(8) 枚举类与类反射

    《Java 核心技术 卷1》 笔记 第五章 继承(9) 异常捕获与反射运用

    《Java 核心技术 卷1》 笔记 第五章 继承(10)反射

    网友评论