首页 > 编程语言 > 详细

【自学java笔记#第二十四天#】反射机制

时间:2020-03-29 22:10:35      阅读:70      评论:0      收藏:0      [点我收藏+]

选用教材:《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方法(暴力反射,忽略安全检查)来实现对于某个字段的读写。

但是我想这个难点可以暂且先放一放,学完后一章的接口再回过头来比较两者的优劣。

【自学java笔记#第二十四天#】反射机制

原文:https://www.cnblogs.com/yizhinailu/p/12594944.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!