3.反射实践

文章目录

      • 一.实现数组的拷贝
      • 二.资源文件的加载

一.实现数组的拷贝

新建类ArrayDemo

//API里的数组拷贝
public class ArrayDemo {
	public static void main(String[] args) {
		//源和目标数组
		Object[] src = new Object[] {1,2.4,"你好",true};
		Object[] dest = new Object[12];
		int srcPos = 0;
		int destPos = 2;
		int length = 4;
		//调用拷贝方法
		arraycopy(src,srcPos,dest,destPos,length);
		//打印数组
		System.out.println(Arrays.toString(dest));
	}

    /**
    *数组的拷贝
    *Object[] src 源
    *int srcPos 源开始位置
    *Object[] dest 目标
    *int destPos 目标开始位置
    *int length 长度
    */
	private static void arraycopy(Object[] src, int srcPos, Object[] dest, int destPos, int length) {
		if (src == null || dest == null) {
			throw new NullPointerException("数组不能为空");
		}
		if (!src.getClass().isArray() || !dest.getClass().isArray()) {
			throw new ArrayStoreException("源和目标数组都必须是数组");
		}
		//
		if (srcPos < 0 || destPos < 0 || length < 0 
				|| destPos + length > Array.getLength(dest)
				|| srcPos + length > Array.getLength(src)) {
			throw new ArrayIndexOutOfBoundsException("数组越界异常");
		}
		//比较两个数组的类型 getCompnentType() 返回数组组件的类型
		if (src.getClass().getComponentType() != dest.getClass().getComponentType()) {
			throw new ArrayStoreException("元和目标元素类型必须相同!");
		}
		for (int i = srcPos; i < length; i++) {
			//获取源数组的 i 索引的元素
			Object temp = Array.get(src, i);
			//设置目标数组的元素
			Array.set(dest, destPos ++ , temp);
		}
	}
}

二.资源文件的加载

新建类LoadResourceDemo

//加载文件资源
public class LoadResourceDemo {
	public static void main(String[] args) throws Exception{
		//方式1
		System.out.println("\n---------方式一-------------");
		test1();
		//方式二
		System.out.println("\n---------方式二-------------");
		test2();
		//方式三
		System.out.println("\n---------方式三-------------");
		test3();
	}
	//方式三
	private static void test3() throws Exception {
		Properties p = new Properties();
		//在这里使用的是LoadResourceDemo的字节码路径去寻找db.properties文件.
		//也就是从bin/com/_520i/_06_load_resource路径去寻找. 
		InputStream in = LoadResourceDemo.class.getResourceAsStream("db.properties");
		p.load(in);
		System.out.println(p);
	}
	//方式二
	private static void test2() throws Exception {
		Properties p = new Properties();
		//获取类加载实例
		ClassLoader loader = Thread.currentThread().getContextClassLoader();
		//这里是从资源文件里加载 如果没有需要新建资源文件
		InputStream in = loader.getResourceAsStream("db.properties");
		//需要抛出异常
		p.load(in);
		System.out.println(p);
		
	}
	//方式一
	private static void test1() throws Exception {
		//获取Properties实例
		Properties p = new Properties();
		//获取输入流
		InputStream inStream = new FileInputStream("D:/java/db.properties");
		//加载资源
		p.load(inStream);
		//打印
		System.out.println(p);
	}
}

你可能感兴趣的:(自我学习总结,JavaSE第十九章,反射)