5.7.5 使用反射编写泛型数组方法
扩展数组
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();
}
}
}
}
作者建议:不用少用Method对象回调功能,对于Java来说,使用接口更好
5.8 继承设计和技巧
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());
}
}
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)反射