选用教材:《Java核心技术卷一》
第五章 继承之Java的反射机制
1、书上没有把Class类讲得很透彻,结合黑马的视频看了之后,发现Class这个特殊的类还比较好理解。
也就是在编译和运行的过程之间还存在一个Class类对象阶段,在这个阶段里,源代码里的字段、成员方法和构造器都会被存储在Class对象的Field[]、Constructor[]和Method[]三个数组中。而java的反射机制,就是利用Class类对象阶段出现的对象(也包括类)进行一些操作。
2、这一节的难点之一是利用Method类的invoke方法来调用任意方法及构造器。
代码实例如下:
public class MethodTableTest { public static void main(String[] args) throws ReflectiveOperationException { //class.getMethod(String,class....); //MethodTableTest.class得到一个class对象,再调用getMethod方法 Method sqrt=Math.class.getMethod("sqrt",double.class);//将math类的sin方法设置为Method对象 printTable(1,10,10,sqrt); } public static void printTable(double from,double to,int n,Method f) throws ReflectiveOperationException { System.out.println(f);//输出第一行的方法名 double dx=(to-from)/(n-1); for(double x=from;x<=to;x+=dx)//控制输出格式 { double y=(Double)f.invoke(null, x); System.out.printf("%10.4f | %10.4f%n",x,y); } } }
3、反射机制比较简单的应用还包括:创建一个泛型数组。
代码如下:
public class CopyOfTest { public static void main(String[] args) { int[]a= {1,2,3}; a=(int[])goodCopyOf(a,10); System.out.println(Arrays.toString(a)); String[]b= {"Tom","Dick","Harry"}; b=(String[])goodCopyOf(b,10); System.out.println(Arrays.toString(b)); //System.out.println("The following call will generate an exception:"); //b=(String[]) badCopyOf(b,10);//会出现报错信息 } public static Object[] badCopyOf(Object[] a,int newLength) { var newArray=new Object[newLength]; System.arraycopy(a, 0, newArray, 0,Math.min(a.length,newLength)); return newArray; } @SuppressWarnings("rawtypes") public static Object goodCopyOf(Object a,int newLength) { Class cl=a.getClass(); if(!cl.isArray()) return null; Class componetType=cl.getComponentType(); int length=Array.getLength(a); Object newArray=Array.newInstance(componetType, newLength); //创建一个Array对象的实例,并赋给Object对象 System.arraycopy(a, 0, newArray, 0, Math.min(length, newLength));//确保数组不越界 //public static void arraycopy?(Object src,int srcPos,Object dest,int destPos,int length) //src:源数组,srcpro:源数组中的起始位置,dest:目标数组,destPos:目标数组中的起始位置,length:要复制的数组元素的数量 return newArray; } }
3、暂时还没有弄懂的难点是:利用toString和setAccessible方法(暴力反射,忽略安全检查)来实现对于某个字段的读写。
但是我想这个难点可以暂且先放一放,学完后一章的接口再回过头来比较两者的优劣。
原文:https://www.cnblogs.com/yizhinailu/p/12594944.html