——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());//true
System.out.println(a1.getClass().getName());//[I
System.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.Object
Object obj1=a1;
Object obj2=a4;
//Object[] obj3=a1;//错
Object[] obj4=a3;
Object[] obj5=a4; System.out.println(a1);//[I@139a55
System.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