反射机制对数组的操作1
取得数组的Class对象以及相关属性和方法
public class ClassArrayDemo{
public static void main(String args[]) throws Exception{
int temp[] = {1,2,3} ;// 声明一整型数组
Class<?> c = temp.getClass().getComponentType() ; // 取得数组的Class对象
System.out.println("类型:" + c.getName()) ; // 取得数组类型名称
System.out.println("长度:" + Array.getLength(temp)) ;
System.out.println("第一个内容:" + Array.get(temp,0)) ;
Array.set(temp,0,6) ;
System.out.println("第一个内容:" + Array.get(temp,0)) ;
}
};
对数组的开辟和拷贝
public class ChangeArrayDemo{
public static void main(String args[]) throws Exception{
int temp[] = {1,2,3} ;// 声明一整型数组
int newTemp[] = (int []) arrayInc(temp,5) ; // 重新开辟空间5
print(newTemp) ;
System.out.println("\n-------------------------") ;
String t[] = {"lxh","mldn","mldnjava"} ;
String nt[] = (String [])arrayInc(t,8) ;
print(nt) ;
}
public static Object arrayInc(Object obj,int len){
Class<?> c = obj.getClass() ;
Class<?> arr = c.getComponentType() ; // 得到数组的
Object newO = Array.newInstance(arr,len) ; // 开辟新的大小
int co = Array.getLength(obj) ;
System.arraycopy(obj,0,newO,0,co) ; // 拷贝内容
return newO ;
}
public static void print(Object obj){ // 数组输出
Class<?> c = obj.getClass() ;
if(!c.isArray()){ // 判断是否是数组
return;
}
Class<?> arr = c.getComponentType() ;
System.out.println(arr.getName()+"数组的长度是:" + Array.getLength(obj)) ; // 输出数组信息
for(int i=0;i<Array.getLength(obj);i++){
System.out.print(Array.get(obj,i) + "、") ; // 通过Array输出
}
}
};
反射机制对数组的操作2
public class RefletTest {
/**
* 数组的的反射
*/
public static void main(String[] args) {
String[] obj=new String[]{"a","b","c"};
printArrays(obj);
printArrays("xyz");
}
private static void printArrays(Object obj) {
Class cazz=obj.getClass();
if(cazz.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);
}
}
}
用反射方式执行某个类中的main方法
public class ReflectTest {
public static void main(String[] args) throws Exception {
String startingClassName=args[0];
Method mainMethod=Class.forName(startingClassName).getMethod("main",String[].class);
//这一点特别注意:这里使用new Object[]数组将new String[] 进行打包成一个对象
mainMethod.invoke(null,new Object[]{new String[]{"111","222","333"}});
}
}
class TestArguments {
public static void main(String[] args)
{
for(String s:args)
System.out.println(s);
}
}
数组类型与Object类型之间的关系
public class ArrayReflectTest {
/**
* 数组的反射
* 1--具有相同维数和元素类型的属于属于同一个类型。及具有相同的Class实例对象。
* 2--代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
* 3--基本类型的一维数组可以被当作Object类型使用,不能当做Object[]类型使用;
* 非基本类型的一维数组,即可以当做Object[]类型使用,又可以当做Object[]类型使用。
*
*/
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()); //返回true因为符合(具有相同维数和元素类型的属于属于同一个类型。及具有相同的Class实例对象。);
System.out.println(a1.getClass()==a3.getClass());//返回false,因为a1数组的类型是基本数据类型的数组,其类型属于Object类型,而a3是引用类型的数组,其类型属于Object[]类型。即类型不同和维数也不同
System.out.println(a1.getClass()==a4.getClass());//返回false因为a1数组的类型是基本数据类型的数组,而a4是引用类型的数组。即类型不同
Object obj1=a1;
Object obj2=a2;
Object[] obj3=a3;
Object[] obj4=a4;
System.out.println(obj1+"\n"+obj2+"\n"+obj3+"\n"+obj4+"\n");
System.out.println(Arrays.asList(obj1));//基本类型的一维数组可以被当作Object类型使用,不能当做Object[]类型使用
System.out.println(Arrays.asList(obj3));//非基本类型的一维数组,即可以当做Object[]类型使用,又可以当做Object[]类型使用。
System.out.println(Arrays.asList(obj4));//非基本类型的一维数组,即可以当做Object[]类型使用,又可以当做Object[]类型使用。
}
}