黑马程序员——反射深入理解
来源:互联网 发布:2017零售业数据分析 编辑:程序博客网 时间:2024/04/20 05:52
------- android培训、java培训、期待与您交流! ----------
仔细重新研究了一遍反射,发现有好多小细节自己理解的并不是很好,现在重新整理笔记。
package cn.heima;import java.lang.reflect.Constructor;public class ReflectDemo {public static void main(String[] args)throws Exception {//得到带有一个参数的构造方法,类型是Constructor,参数类型是StringBuffer.classConstructor con1 =String.class.getConstructor(StringBuffer.class);//创建一个实例对象,注意两点,(1)传递的参数(2)强制类型装换//使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,//并用指定的初始化参数初始化该实例。//public T newInstance(Object... initargs) 注意返回类型String str =(String) con1.newInstance(new StringBuffer("abc"));// 返回 Class 对象,该对象表示声明由此 Constructor 对象表示的构造方法的类System.out.println(con1.getDeclaringClass());System.out.println(str);//现在是用一个String的字节码得到构造函数,然后在得到一个实例对象//Class-->Constructor-->String//Class--->String//创建str2此处并没有强转,为什么,个人理解,因为我用的就是String.class已经确定了字节码,//编译器已经知道了String str2 = String.class.newInstance();String str3 = (String)Class.forName("java.lang.String").newInstance();System.out.println(str2.length());System.out.println(str3.length());}}
祥叔经典例子:
ReflectPoint rp = new ReflectPoint(3,5);//fieldY是字节码对应的变量Field fieldY = rp.getClass().getField("y");//get()用于获取某个对象对应的该变量的值System.out.println(fieldY.get(rp));//私有的需要采用另外的函数getDeclaredField()Field fieldX = rp.getClass().getDeclaredField("x");//传说中的暴力反射fieldX.setAccessible(true);System.out.println(fieldX.get(rp));ChangStringValue(rp);}private static void ChangStringValue(Object obj) throws Exception {Field[] fields = obj.getClass().getFields();for(Field field:fields){if(field.getType()==String.class){//得到变量的值String oldValue =(String) field.get(obj);//字符串的替换方法String newValue = oldValue.replace('a', 'b');//set()给对象设置新的valuefield.set(obj, newValue);System.out.println(field.get(obj));}}}
//Method. name表示方法的名称。例如String类中包含charAt方法,所以才能在此处使用//必须是类中确定存在的方法才可以//String.class.getMethod(name, parameterTypes);Method charAt = String.class.getMethod("charAt", int.class);//charAt.invoke(obj, args)这里需要加强理解。System.out.println(charAt.invoke(str, 1));//JDK1.4格式System.out.println(charAt.invoke(str, new Object[]{2}));
//传递一个字符串作为类名String StartingClassName = args[0];//得到main()的Method对象Method mainMethod =Class.forName(StartingClassName).getMethod("main", String[].class);//调用方法invokke(),因为是main,是静态的,所以第一个参数为null//第二个参数要求必须是Object数组,用两种方式来表示。mainMethod.invoke(null,(Object) new String[]{"dandan","jiaji","qiqi"});mainMethod.invoke(null,new Object[]{ new String[]{"dandan","jiaji","qiqi"}});}class Test{public static void main(String[] args){for(String arg:args){System.out.println(arg);}}}
int[] a1 = new int[3];int[] a2 = new int[4];int[][] a3 = new int[2][3];String[] a4 = new String[]{"d","c","b","a"};//具有相同维数和元素类型的数组属于同一个类型,即具有相同的class实例对象。System.out.println(a1.getClass()==a2.getClass());//System.out.println(a1.getClass()== a3.getClass());//System.out.println(a1.getClass()==a4.getClass());//数组的父类都是ObjectSystem.out.println(a1.getClass().getSuperclass().getName());System.out.println(a3.getClass().getSuperclass().getName());System.out.println(a4.getClass().getSuperclass().getName());//异常java.lang.NullPointerException//System.out.println(int.class.getSuperclass().getName());//基本类型的一维数组可以被当做Object类型使用,不能当做Object[]使用//Object[] obj1= a1;Object[] obj2 = a3;Object[] obj3 = a4;//Arrays的使用System.out.println(Arrays.asList(obj3));
printObject(a4);}private static void printObject(Object obj) {if(obj.getClass().isArray()){//得到长度int len = Array.getLength(obj);for(int i=0;i<len;i++){//打印每个元素System.out.println(Array.get(obj, i));//得到每个元素对应的类型 a[i].getClass().getName()System.out.println(Array.get(obj,i).getClass().getName());}}else{System.out.println(obj);}}
//迷你小框架//一定记住用完整的路径,但是完成的路径不是硬编码,而是计算出来的。//InputStream in =//new FileInputStream("D:\\Workspaces\\MyEclipse10\\javaenhance2\\src\\cn\\heima\\config.properties");//InputStream in = //ReflectTest2.class.getClassLoader().getResourceAsStream("\\cn\\heima\\config.properties");InputStream in = ReflectTest2.class.getResourceAsStream("config.properties");Properties props = new Properties();props.load(in);String className = props.getProperty("className");Collection con1 = (Collection)Class.forName(className).newInstance();------- android培训、java培训、期待与您交流! ---------- 详细请查看:http://edu.csdn.net/heima/
- 黑马程序员——反射深入理解
- 黑马程序员—反射的深入讲解
- 黑马程序猿——深入理解什么是反射
- 黑马程序员 (高新技术)反射技术的深入理解
- 黑马程序员---java基础加强 反射的深入理解
- 黑马程序员—反射
- 黑马程序员—反射
- 黑马程序员—反射
- 黑马程序员—反射
- 黑马程序员—反射
- 黑马程序员—反射
- 黑马程序员—反射
- 黑马程序员—反射
- 黑马程序员——反射的理解与应用
- 黑马程序员——深入理解泛型
- 黑马程序员——深入理解C#的事件模型
- 黑马程序员--反射的理解
- 黑马程序员——反射
- SRM 499 250pt
- MFC radio button 的使用方法
- undo学习系列之澄清一个被误解的概念
- vi笔记
- 《C++标准程序库》第四章摘录与笔记
- 黑马程序员——反射深入理解
- Eclipse 使用dropins的插件安装方式【转】
- vi命令参考
- 韩顺平 zend framework 视频教程 源代码和笔记心得第5讲——第6讲 投票系统源代码
- vi命令大全
- vi命令
- SRM 499 DIV2 500pt
- vi命令
- eclipse和Myeclipse什么关系