------------Android培训 Java培训 期待与您的交流!---------
/*数组的反射 数组也是一种类型
*如果相同的元素类型以及具有相同的维度的数组反射是同一个类型
*Array工具类针对完成对数组的反射操作的一个类
*/
//关于数组反射的一些基础知识
import java.util.*;
import java.lang.reflect.Array;
class ArraysReflectTest
{
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[]{"a","b","c"};
System.out.println(a1.getClass()==a2.getClass());
//System.out.println(a1.getClass()==a3.getClass()); //在jdk的高级版本中他们已经是不可比较类型
//System.out.println(a1.getClass()==a4.getClass()); //不可比较类型
System.out.println(a1.getClass().getName()); //返回[I [表示数据。I表示int
System.out.println(a1.getClass().getSuperclass().getName()); //返回父类的名字
System.out.println(a4.getClass().getSuperclass().getName());
//父类的名字都是Object
Object obj1=a1; //说明一维数组是Object
Object obj2=a4;
//Object []obj3=a1; //由于a1里面装的是int,int不是Object
Object []obj4=a3; //a3[]里面装的是int [],是Object
Object []obj5=a4; //Sring元素是Object
//Array.asList对处理int[]和String[]的差异
System.out.println(Arrays.asList(a1)); //打印[[I+哈希值,因为一维数组当做一个Object
System.out.println(Arrays.asList(a4)); //遍历数组
printObject(a1);
printObject("dwda");
}
//只能得到数组元素的类型,a[0].getClass().getName();
//不能得到数组a的类型
//数组反射的应用,将Object打印出来
public static void printObject(Object obj)
{
Class cls=obj.getClass();
if (cls.isArray()) //如果是数组,就取出每一个
{
int len=Array.getLength(obj);
for (int i=0;i<len;i++ )
{
System.out.println(Array.get(obj,i));//获取数组第i个元素
}
}else //不是数组就直接打印obj
{
System.out.println(obj);
}
}
}
//反射的综合案例 ArrayList_HashSet的比较及Hashcode分析
import java.util.Collection;
import java.util.ArrayList;
public class ReflectTest2
{
public static void main(String [] args)
{
Collection collections=new ArrayList(); //Collection collections=new HashSet();
ReflectPoint pt1=new ReflectPoint(3,3); //ReflectPoint pt1=new ReflectPoint(3,3);
ReflectPoint pt2=new ReflectPoint(5,5); //ReflectPoint pt2=new ReflectPoint(5,5);
ReflectPoint pt3=new ReflectPoint(3,3); //ReflectPoint pt3=new ReflectPoint(3,3);
//当equals方法覆盖了,pt1==pt3
collections.add(pt1); //collections.add(pt1);
collections.add(pt2); //collections.add(pt2);
collections.add(pt3); //collections.add(pt3);
collections.add(pt1); //collections.add(pt1);
//打印结果为4 //HashSet的打印结果为3
System.out.println(collections.size()); //重写了hashCode和equals,hashSet就不能放进pt3,打印结果为2
//不重写hashCode,只重写equals结果还是3
}
}
//内存泄露演示
//当重写了hashCode后
//pt1.y=7; 改变了参与hashCode计算的y变量
//collections.remove(pt1); 移除失败
//打印结果则还是2
//ArrayList与HashSet的区别
//ArrayList :
/*
有顺序的集合,就相当与数组,从第一个空位置开始按顺序放对象引用,同一变量多次放进去
有放进去的先后顺序。
*/
//HashSet: 只能把之前pt1的remove了,才能放进相同的对象pt1
//面试题 hashCode的作用
//把内存分成多个区域,每一个对象都能算出hashCode,根据hashCode确定你存在区域
//查找时,根据hashCode迅速缩小搜索范围到某个区域,然后在这个区域进行查找
//关于内存泄露的问题
/*
当一个对象被存储进hashSet集合中后,就不鞥修改这个对象中的那些参与计算哈希值的字段了
否则,对于修改后的哈希值和最初存储进HashSet集合中是哈希值就不同了,,你将无法通过当
前的引用作为参数去检索对象,和从集合中单独移除当前对象。
这便是所谓的内存泄露。
*/
//反射作用,实现框架的的一个小功能 通过反射实现对配置文件信息的获取,在MyEclipse
创建一个配置文件count.properties
里面写上
className=java.util.ArrayList //也可以改为java。util.HashSet
class KJTest
{
public static void main(String []args)
{
InputStream ips=new FileInputStream("count.properties"); //导入相应的包
Properties props=new Properties(); //导入相应的包
props.load(ips);
ips.close();
String className=props.getProperty("className"); //获取配置文件中classNamed的值
Collection cols=(Collection)Class.forName(className).newInstance(); //反射类调用构造方法创建对象
}
}