黑马程序员--基础加强--第六篇--反射

来源:互联网 发布:美女图片源码 编辑:程序博客网 时间:2024/06/14 10:46

ASP.Net+Android+IOS开发.Net培训期待与您交流!

数组的反射
1具有相同维数和元素类型的数组属于同一类型,即具有相同的Class实例对象
2代表数组的Class实例对象的getSuperClass()方法返回的父类为Objece类对应的Class
3基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既能当作Object类型使用,又可以当作Object[]类型使用
4Arrays.asList()方法处理int[] 和String[]时的差异
5Array工具类用于完成对数组的反射1.什么叫反射?

JAVA中的类有很多,这些类同属一类事物,描述这些事物的JAVA类就是Class。

对比提问,众多的人用Person表示,众多的java类用Class表示。

Person类的实例为各个具体的人,张三李四,那么Class的实例代表什么呢?那就是各个java类在内存中的字解码文件,
例如Array,Math在内存中的字节码文件,当然各个类在内存中的字节码文件都是不同的,这些字节码文件类似,这就
相当于每个对象。

2.如何得到这些类的字节码对应的实例对象呢?


类名.class,例如System.class任何类型都可以用class得到他的字节码文件 数组 void 
对象名.getClass(),例如 new Integer().getClass()

Class.forName("类名的绝对路径")  例如Class.forName("java.util.Properties")


Class.isArray() 
          判定此 Class 对象是否表示一个数组类。
Class.isMemberClass() 
          当且仅当底层类是成员类时返回 true。
 

最重要一句话,就是反射就是把java中的各个成分(包,方法,构造方法,数据)映射成相应的类

3:Class常用方法

Class.forName(String classname);

Class.getFiled()

Class.getFileds();

Class.getMethod();

Class.getConstruct(construct name);

Class.getConstructs();

isPrimitive()

4.练习

反射的基本练习

import java.lang.reflect.*;public class RefTest{public static void main(String[] args)throws Exception{Integer a = 1;Class cl1 = a.getClass();Class cl2 = Integer.class;Class cl3 = Class.forName("java.lang.Integer");System.out.println(cl1 == cl2);System.out.println(cl1 == cl3);System.out.println(cl1.isPrimitive());//Integer不是一个基本类型System.out.println("int类型是否是基本类型");System.out.println(int.class.isPrimitive());//int是一个基本类型System.out.println("int 和 Integer是否产生同一字节码");System.out.println(int.class == Integer.class);System.out.println("int 和 Integer的实例是否是一字节码");System.out.println(int.class == Integer.TYPE);System.out.println("void的字节码");System.out.println(void.class);System.out.println("数组是不是基本类型");System.out.println(int[].class.isPrimitive());System.out.println("判断是否是数组类型");System.out.println(int[].class.isArray());Class.isArray();Constructor cos = String.class.getConstructor(StringBuilder.class);//Class也有newInstance,它调用的是类原有无参的构造方法,这样比较简便。String str = (String)cos.newInstance(new StringBuilder("abc"));System.out.println(str);ReflectPoint rp = new ReflectPoint(2,3);//此处filedY不代表值,代表类上的,他代表所有对象该值的抽象,取某个对象的值必须指定对象。Field fieldY = rp.getClass().getField("y");System.out.println(fieldY.get(rp));}}class ReflectPoint{private int x;public int y;public ReflectPoint(int x,int y){this.x = x;this.y = y;}}
使用反射把一个字符串中的字母‘a’换成‘b’,数字加1

public static void replace(String p) throws IllegalArgumentException, IllegalAccessException{Field[] fs = p.getClass().getFields();for(Field f:fs){if(f.getType() == String.class){String oldValue =(String)f.get(p);String newValue = oldValue.replace('b', 'a');f.set(p, newValue);}else if(f.getType() == int.class){int oldValue = (Integer)f.get(p);int newValue = oldValue++;f.set(p, newValue);}}

使用反射查看类的私有变量

ReflectPoint rp = new ReflectPoint(2,3);Field fieldX = rp.getClass().getDeclaredField("x");fieldX.setAccessible(true);//x为私有的System.out.println(fieldX.get(rp));


使用反射调用String的方法

//下面使用反射调用String的方法Method method = str.getClass().getMethod("charAt", int.class);System.out.println(method.invoke(str, 2));//invoke是把这个方法执行一下//如果invoke的第一个参数是null,则代表该方法是静态方法

使用反射操作数据

应注意这几点:

1具有相同维数和元素类型的数组属于同一类型,即具有相同的Class实例对象

2代表数组的Class实例对象的getSuperClass()方法返回的父类为Objece类对应的Class

3基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既能当作Object类型使用,又可以当作Object[]类型使用

4Arrays.asList()方法处理int[] 和String[]时的差异

5Array工具类用于完成对数组的反射

public class ReflectTest {public static void main(String[] args){int[] arr1 = new int[]{1,2};int[] arr2 = new int[]{1,2,3};int[][] arr3 = new int[1][2];String[] arr4 = new String[]{"good","morning"};System.out.println(arr1.getClass() == arr2.getClass());System.out.println(arr1.getClass().getName());System.out.println(arr1.getClass().getSuperclass().getName());System.out.println(arr4.getClass().getSuperclass().getName());Object aObj1 = arr1;Object aObj2 = arr2;Object[] aObj3 = arr3;Object[] aObj4 = arr4;System.out.println(aObj1);System.out.println(aObj2);System.out.println(Arrays.asList(aObj1));System.out.println(Arrays.asList(aObj4));printObject(arr1);printObject("good");}private static void printObject(Object obj){if(obj.getClass().isArray()){for (int i = 0; i < Array.getLength(obj); i++) {System.out.println(Array.get(obj, i));}}else{System.out.println(obj);}}}class TestArguments{public static void main(String[] args){for(String arg:args){System.out.println(arg);}}}
ASP.Net+Android+IOS开发.Net培训期待与您交流!


0 0
原创粉丝点击