反射知识总结

来源:互联网 发布:淘宝小号出售平台2016 编辑:程序博客网 时间:2024/04/30 03:37

//反射/*1.Class 代表一类什么样的事物。Person p1=new Person();注意Class不能实例对象。Class cls1=Data.class//字节码1。。。字节码(Byte-code)是一种包含执行程序、由一序列 op 代码/数据对组成的二进制文件。*/public static void main(String[] args){String str1="abc";Class cls1=str1.getClass();Class cls2=String.Class;Class cls3=Class.forName("java.lang.String");System.out.println(cls1==cls2);//trueSystem.out.println(cls1==cls2);//trueSystem.out.println(cls1.isPrimitive());//判定指定的 Class 对象是否表示一个基本类型。 System.out.println(int.Class.isPrimitive());//trueSystem.out.println(int.Class==Integer.Class);//false}//2.反射就是把java类中的各种成分映射成相应的java类。反射会导致计算机性能下降//3.Constructor类,代表某个类中的一个构造方法。//new String(StringBuffer("abc"))Constructor con1=String.class.getConstructor(StringBuffer.class);//获得方法时要用到的类型,getConstructor()参数可以有多个。编译时String str2=(String)con1.newIstance(new StringBuffer("abc"));//调用获得方法时要用到上面相同类型的实例对象。运行时。Class.newIstance();//该方法内部先得到默认的构造方法,然后用构造方法创建实例对象。String obj=(String)Class.forName("java.lang.String").newIstance();//4.Field类代表某个类的成员变量。public class RefiePoint{private int  x;public int y;public String s1="abll";public String s2="bactbll";public String s3="hdgi";public RefiePoint(int x,int y){super();this.x=x;this.y=y;}public String toString(){return s1+s2+s3;}}class Demo{public static void main(String[] args){RefiePoint pt1=new RefiePoint(3,5);Field fieldY=pt1.getClass().getField("y");//获取y的值。//fieldY 的值是多少?是5错。fieldY不是对象身上的变量,而是类上,要用它取某个对应的值System.out.println(fieldY.get(pt1));//获取y的值。并且打印。Field fieldX=pt1.getClass().getField("x");fieldX.setAccessible(true);//私有的x,必须暴力破解,允许访问。System.out.println(fieldX.get(pt1));changeStringValue(pt1);System.out.println(pt1);}private static void changeStringValue(Object obj)throws Exception{Field[] fields=obj.getClass().getField();//获取字节码,同时获取值。for(Field field:fields){//if(field.getType().equals(String.class)){if(field.getType().equals(String.class)){//写这个,因为字节码是唯一的,只有一份。String oldValue=(String)field.get(obj);String newValue=oldValue.replace('b','a');//把s1,s2,s3的b,替换成a。field.set(obj,newValue);//赋值}}}}//5.Method类代表某个类中的一个成员方法。/*得到类中的某一个方法:例子  :Method charAt=Class.forName("java.lang.String").getMethod("charAt",int.class);调用方法:通用方法:System.out.println(str.charAt(1));反射方式:System.out.println(charAt.invoke(str,1));   如果传递给Method对象的invoke()方法的第一个参数为null,这样的意义是?说明Method对象对应的是一个静态方法。   */class Demo{public static void main(String[] args){String str1="abc";Method methodCharAt=String.class.getMethod("charAt",int.class);ystem.out.println(methodCharAt.invoke(str,1));//结果是b。}}/*写一个程序,这个程序能够根据用户提供的类名。去执行该类中的main方法。解决方法:mainMethod.invoke(null,new Object[](new String[]{"xxx"}));//先把当成一个Object包,然后系统自动把它解包。mainMethod.invoke(null,Object(new String[]{"xxx"}));//编译器会作特殊处理,编译时不把参数看待,也就不会打散成若干个数组。*/class Demo{public static void main(String[] args){//Test.main(new String[]{"111","222","333"});String startC=arg[0];Method mainM=Class.forName(startC).getMethod("main",STring[].class);mainM.invoke(null,new Object[](new String[]{"111","222","333"}));mainM.invoke(null, (Object)(new String[]{"111","222","333"}));}}class Test{public static void main(String[] args){for(String arg:args)System.out.println(arg);}}/*6.数组的反射1.具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。2.代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类的Class。3.基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用,  非基本类型的数组可以当作Object使用,又可以当作Object[]使用。4.Arrays.asList方法处理int[]和String[]时的差异。5.数组反射的应用。获取方法。*/class TestArray{public static void main(String[] args){int[] a1=new int[]{1,2,3};//注意数组的使用。int[] a2=new int[4];int[][] a3=new int[2][3];String[] a4=new String[]{"1","2","3"};System.out.println(a1.getClass() == a2.getClass());//trueSystem.out.println(a1.getClass() == a3.getClass());//flaseSystem.out.println(a1.getClass() == a4.getClass());//flaseSystem.out.println(a1.getClass().getName());System.out.println(a1.getClass().getSuperclass().getName());System.out.println(a4.getClass().getSuperclass().getName());Object ab1=a1;Object ab4=a4;Object[] ab1=a1;//这句话是错误的Object[] ab1=a4;System.out.println(Arrays.asList(a1));//输不出想要的结果。...查看API区别Arra.asList的方法版本。System.out.println(Arrays.asList(a4));//输出的结果为abc。printObject(a4);printObject("xyz");}private  static void printObject(Object obj){Class clazz=obj.getClass();if(clazz.isArray()){for(int i=0;i<Array.getLength(obj);i++){System.out.println(Array.get(obj,i));}}else{System.out.println(obj);}}}//集合的反射class TestArray{public static void main(String[] args){Collection coll=new HashSet();TestArray pt1=new TestArray(3,3);TestArray pt2=new TestArray(5,5);TestArray pt3=new TestArray(3,3);coll.add(pt1);coll.add(pt2);coll.add(pt3);coll.add(pt1);//没有hashCode()可以存进去,但是重写了该方法就不能。pt1.y=7;coll.remove(pt1);//去除。。但是没有去除,因为hash的地址改变了。Systemout.println(coll.size());//为1}}/*反射的作用-----实现框架功能。1.使用别人的类:两种方法。2.框架与工具类的区别。要学会使用。框架要解决的核心问题1.我在写框架(房子)时,你这个用户可能还在上小学,还不会写程序呢?我写的框架程序怎样能调用到你以后写的类(门窗)呢?2.因为在写程序时无法知道要被调用的类名,所以,在程序中无法直接new某个类的实例对象,而要用反射方式来做。步骤:1.写从配置文件。    config.properites2.在文件内写入:className=java.util.ArrayList//(可以改变)*/class TestArray{public static void main(String[] args)throws Exception{InputStream ips=new FileInputStream("config.properites");Properties props=new Properties();props.load(ips);ips.close();//关闭,不关闭可能出现内存泄露。String classname=props.getProperty("className");//两个classname,第一个可以是任意的变量。Collection collextions=(Collection)Class.forName(className).newIstance();//调用不带参数的构造方法。}}


0 0
原创粉丝点击