黑马程序员--基础加强--第六篇--反射
来源:互联网 发布:美女图片源码 编辑:程序博客网 时间: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.如何得到这些类的字节码对应的实例对象呢?
对象名.getClass(),例如 new Integer().getClass()
Class.forName("类名的绝对路径") 例如Class.forName("java.util.Properties")
判定此 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);}}}
- 黑马程序员--基础加强--第六篇--反射
- 黑马程序员--基础加强--第六篇--内省
- 黑马程序员基础加强---反射
- 《黑马程序员》基础加强---反射
- 黑马程序员--基础加强反射
- 黑马程序员-----基础加强-反射
- 黑马程序员-----基础加强-反射
- 黑马程序员-----基础加强-反射
- 黑马程序员-----基础加强-反射
- 黑马程序员-----基础加强-反射
- 黑马程序员 20 Java基础加强-02-反射篇
- 黑马程序员---Java基础加强反射小结
- 黑马程序员-Java基础加强-反射
- 黑马程序员_基础加强(3) 反射
- 黑马程序员_基础加强_反射
- 黑马程序员_Java基础加强之反射
- 黑马程序员-JAVA基础加强-反射1
- 黑马程序员-JAVA基础加强-反射2
- QT 4.8 静态库编译方法
- android WebView html5 使用本地存储
- QT中的qmake详解
- ACM HDOJ 1312 (Red and Black)
- Qt Creator插件工作流程代码走读
- 黑马程序员--基础加强--第六篇--反射
- 谷歌蝉联"财富"2014最佳雇主
- iphone开发 地图线路
- Qt中translate、tr关系 与中文问题
- Qt文件处理
- Qt的QFile类详解
- backgroundPosition
- QString和char字符串数组之间的转换
- 图解android中用pull解析并生成xml文件