java中的反射三(反射机制深入---对数组的操作)

本文深入探讨Java反射机制在数组操作中的应用,包括获取数组的Class对象、相关属性和方法,数组的开辟与拷贝,以及如何用反射执行类中的main方法。同时,文章还阐述了数组类型与Object类型的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反射机制对数组的操作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[]类型使用。
        
	}

}


 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值