黑马程序员---JAVA反射机制 二
来源:互联网 发布:java外包 编辑:程序博客网 时间:2024/06/11 17:39
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
数组的反射
具有相同维数和元素类型的数组属于同一类型,即具有相同的Class实例对象
代表数组的Class实例对象的getSuperClass方法返回的父类为Object类对应的Class
基本类型的一维数组可以被当做Object类型使用不能当做Object[]类型使用
非基本类型的一维数组既可以当做Object类型使用也可以当做Object[]类型使用
Arrays.asList()方法处理int[]和String[]时的差异
Array工具类用于完成对数组的反射操作
int[]a1=new int[]{1,2,3};int[]a2=new int[4];int[][]a3=new int[2][3];String []a4=new String[]{"a","b","c"}; System.out.println(a1.getClass()==a2.getClass());//trueSystem.out.println(a1.getClass().getName());//[ISystem.out.println(a1.getClass().getSuperclass().getName());//java.lang.Object System.out.println(a3.getClass().getName());//[[I System.out.println(a3.getClass().getSuperclass().getName());//java.lang.ObjectObject obj1=a1;Object obj2=a4;//Object[] obj3=a1;//错Object[] obj4=a3;Object[] obj5=a4; System.out.println(a1);//[I@139a55System.out.println(a4);//[Ljava.lang.String;@1db9742 System.out.println(Arrays.asList(a1));//[[I@139a55] System.out.println(Arrays.asList(a4));//[a, b, c]
传过来一个Object类型的数据,把它打印出来
首先要判断这个Object是不是数组,然后分别打印
如果是数组就拆包,如果不是就直接打印
class TestArgument{ public static void main(String[] args) { String []a1=new String[]{"a","b","c"}; printObject(a1); printObject("xyz"); } private static void printObject(Object obj) { Class clazz=obj.getClass(); if (clazz.isArray()) { int len=Array.getLength(obj); for(int i=0;i<len;i++){ System.out.println(Array.get(obj, i)); } }else{ System.out.println(obj); } }}
反射的作用—实现框架功能
框架与框架要解决的核心问题
我盖房子给用户住,有用户自己负责安装门窗、空调、家具等,我做的房子就是框架,用户需要用我的框架,然后把门窗等放进框架中,框架与工具类的区别是工具类被用户类调用,而框架则是调用用户提供的类
框架要解决的核心问题
我在写框架(房子)时,你这个用户可能还在上小学,还不会写程序,我写的框架程序怎样调用到你以后写的类(门窗)呢?
因为写框架时不知道要被调用的类名,所以在程序中无法直接new某个类的实例对象,而要用反射来做
综合案例
先直接用new语句创建ArrayList和HashSet的实例对象,比较两个集合的运行结果差异
然后改为采用配置文件加反射的方式创建ArrayList和HashSet的实例对象
ArrayList是按顺序放对象的引用
HashSet是放对象是要比较对象的hash值
package reflect;public class ReflectPoint { private int x; public int y; public String str1="ball"; public String str2="basketball"; public String str3="itcast"; public ReflectPoint(int x, int y) { this.x = x; this.y = y; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + x; result = prime * result + y; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ReflectPoint other = (ReflectPoint) obj; if (x != other.x) return false; if (y != other.y) return false; return true; } @Override public String toString(){ return str1+":"+str2+":"+str3; }}import java.util.ArrayList;import java.util.Collection;import java.util.HashSet;public class ReflectTest3 { public static void main(String[] args) throws InterruptedException {// Collection collections=new ArrayList(); Collection collections=new HashSet(); ReflectPoint pt1=new ReflectPoint(3, 3); ReflectPoint pt2=new ReflectPoint(5, 5); ReflectPoint pt3=new ReflectPoint(3, 3); collections.add(pt1); collections.add(pt2); collections.add(pt3); collections.add(pt1); System.out.println(collections.size()); }}
下面写一个小框架
首先定义一个配置文件config.properties
className=java.util.ArrayList
然后
package reflect;import java.io.FileInputStream;import java.io.InputStream;import java.util.Collection;import java.util.Properties;public class ReflectTest2 { public static void main(String[] args) throws Exception { InputStream ips=new FileInputStream("config.properties"); Properties prop=new Properties(); prop.load(ips); ips.close(); String className=prop.getProperty("className"); Collection collections=(Collection)Class.forName(className).newInstance(); ReflectPoint pt1=new ReflectPoint(3, 3); ReflectPoint pt2=new ReflectPoint(5, 5); ReflectPoint pt3=new ReflectPoint(3, 3); collections.add(pt1); collections.add(pt2); collections.add(pt3); collections.add(pt1); System.out.println(collections.size()); }}
运行这个程序,只要把你写的类名写的配置文件里就好了,当
className=java.util.HashSet,结果为2,
当className=java.util.ArrayList,结果为4
- 黑马程序员--java反射机制(二)
- 黑马程序员---JAVA反射机制 二
- 黑马程序员-Java反射机制
- 黑马程序员-java反射机制
- 黑马程序员-Java反射机制
- 黑马程序员-JAVA反射机制
- 黑马程序员-Java反射机制
- 黑马程序员-JAVA反射机制
- 黑马程序员 java反射机制
- 黑马程序员---Java反射机制
- 【黑马程序员】Java反射机制
- 黑马程序员-Java反射机制
- 黑马程序员--Java 反射机制
- 黑马程序员-Java反射机制
- 黑马程序员---JAVA反射机制
- 《黑马程序员》Java 反射机制
- 黑马程序员-Java反射机制
- 黑马程序员—反射机制(二)
- JavaScript变量及其作用域
- 1228 -- 上了锁的盒子
- 开始学习使用ReactiveCocoa框架
- js打印对象的方法
- 第一周 项目0宣告“主权”
- 黑马程序员---JAVA反射机制 二
- Android 新增系统应用
- 如何安装Parallels Tools
- BNUOJ 弱校联萌15-16第三次训练赛同步赛 K题 Kitchen Robot [状压DP]
- 1229 -- An Easy Problem
- 1599 - Ideal Path
- S3C44b0x通用延时函数,延时time个100us函数理解
- Node.js 练习一
- spring、web服务器加载bean顺序