黑马程序员----反射

来源:互联网 发布:网络摄像头哪种好 编辑:程序博客网 时间:2024/06/03 13:47

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

反射指的是把Java类中的各个成分映射成java类,例如Mothod Class类的一个成分,Mothod同时也是一个java类,Mochod的实例对象表示的是java类的函数。

要理解反射,首先要理解Class类。所有的类文件都有共同属性,把这些共性内容封装成一个类,这个类就叫Class(描述字节码文件的对象)。 Class类中的实例对象,就是各个java类。

    Class和class有什么区别呢?class是java中的类,用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则由此类的实例对象确定,不同的实例对象有不同的属性值。而Class指的是Java程序中的各个Java类是属于同一类事物,都是Java程序的类,这些类称为Class。例如人对应的是Person类,Java类对应的就是Class。Class是Java程序中各个Java类的总称;它是反射的基石,通过Class类来使用反射。

接着我用以下代码来说明反射的一些用法:

//获得字节码的3种方式//1、类名.class  2、对象.getClass()  3、Class.forName("类名")//用一个数组得到某个类的所有构造方法,注意使用Class.forName时类名需要加引号Constructor []constructors=Class.forName("java.lang.String").getConstructors();//获得String类的构造方法,括号填目标构造方法的参数类型String.class.getConstructor();        //创建一个构造方法类的实例对象constructor1,赋值为String的构造函数,括号里放的是参数类型Constructor constructor1= Class.forName("java.lang.String").getConstructor(StringBuffer.class);//使用构造方法创建对应的对象实例,括号里放的是具体的参数String s1=(String)constructor1.newInstance(new StringBuffer("abc"));//不仅仅Constructor 可以创建对象, Class也可以创建对象String s2=(String) Class.forName("java.lang.String").newInstance();//判断是否是数组int [].class.isArray();//获取String类的CharAt方法Method method1=String.class.getMethod("charAt", int.class);        //调用method1方法,当调用方法时,有多个参数,则应把参数做成一个数组,若数组指表示一个参数时,需要将数组再一次封装(前面加上(Object))String s3="abcabc";method1.invoke(s3, 1);//获取一个对象的java类的父类s3.getClass().getSuperclass().getName();//获取Object数组里的成员并返回String []arr={"ab","abc","abcd"};System.out.println(Arrays.asList(arr));//若数组是数字数组,则遍历打印int []arr2={1,2,5,2,8};for(int i=0;i<arr2.length;i++){System.out.println(Array.get(arr2, i));}class Xy{private int x; public int y;public Xy(int x, int y) {super();this.x = x;this.y = y;}}Xy xy1=new Xy(3,5);        //创建一个成员变量fieldY,指向Xy类的成员变量yField fieldY=Class.forName("Xy").getField("y");//创建一个成员变量fieldY,指向Xy类的成员变量x,由于x的访问修饰符是private,需要用特殊的方法getDeclare来访问Field fieldX=Class.forName("Xy").getDeclaredField("x");//暴力反射,不管是什么修饰符,都可以读取fieldX.setAccessible(true);    


0 0