黑马程序员——反射深入理解

来源:互联网 发布: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/
原创粉丝点击