java的反射

能够分析类能力的程序称为反射,我们为了在程序运行过程中能够动态的去获得对象域,对象的方法,提出了反射的概念

一个Class 对象将表示一个特定类的属性,获取这个属性有三种方法

(1)通过对象.GetClass可以获取这个属性

(2)或者通过类的名字.class也可以获得这个属性(类要是在包里包的名字也是类名字的一部分)

(3)Class.forName (className ) 通过类名的字符串来获取

 

 

Class的对象的方法 newlnstance ( ), 可以用来动态地创建一个类的实例,比如e.getClass().newlnstance()就是创建一个和e相同类型的对象

 

 

可以通过下面这个方式来对数组进行扩容

    public static Object goodCopyOf ( Object a , int newLength )
    {
        Class cl = a . getClass();//先获取对象的类型
        if (!cl.isArray()) return null ;//如果不是数组,直接退出
        Class componentType = cl.getComponentType();//获取数组中元素的类型
        int length = Array. getLength(a);//得到数组原来的长度
        Object newArray = Array.newInstance (componentType,newLength);//根据元数类型和数组新长度创建数组
        System . arraycopy (a,0,newArray,0,Math.min(length,newLength));//拷贝
        return newArray ;
    }
}

1.通过反射来获取对象中的域值

AA a = new AA();
Class cl = AA.getClass();//获取这个类的Class对象
Filed f = cl.getDeclaredField("name");//获取对象域中叫name的
Object v = f.get (a) ;//通过get方法传入实际的对象,得到a.name的值

2.通过反射来调用对象中的方法(类似于函数指针)

AA tt = new AA();
Class aa = AA.class;
int w = 12;
//其中getMethod中填方法的名字以及对应需要什么类型的参数
//invoke中填具体那个对象的方法,以及实际传入的参数        aa.getMethod("Myprint",int.class,String.class).invoke(tt,w,"biubiu");

//调用的函数为
    public void Myprint (int aa,String str)
    {
        System.out.println(aa);
        System.out.println(str);
    }

 注:不要过多的使用反射,编译器很难帮助人们发现程序中的错误 , 因此只有在运行时才发现错误并导致异常

posted @ 2019-02-27 12:59  TheQi  阅读(199)  评论(0编辑  收藏  举报