利用反射动态操作数组

java语言中,数组对象并不是从某个类实例化出来的,而是JVM动态创建的.对数组对象使用如下操作,可看到数组对应的Class对象.通过RTTI(Run-Time Type Information)可直接检查数组的运行时类型,以及它的签名.下方的 “[L”就是int[]/Integer[] 的运行类型.

1 Integer[] integers = (Integer[]) Array.newInstance(Integer.class,4);
2 System.out.println(integers.getClass());
3 结果: [Ljava.lang.Integer

Java反射机制使用Array类, java.lang.Class类在运行时获取数组的相关信息. 
注意:Array 要和 Arrays区分开,后者是数组工具类.类比于Collections.

  • 数组实例化
1 方法1: Integer[] integers = new Integer[4];
2 方法2: Integer[] integers = {1,2,4,5};
3 方法3: 使用反射 Integer[] integers = (Integer[])Array.newInstance(Integer.class,4);
4 方法4:
5 // componentType是数组类型;
6 Object array = Array.newInstance(componetType,lenght);

通过Array的set(),get()方法可以操作数组.

1 Array.set(integers,0,2);
2 Array.set(integers,1,4);
3 System.out.println(Array.get(integers,1));
4 结果: 4

利用反射,可进行如下操作:

代码:

 1 //1-判断是否是数组
 2 boolean isArray = integers.getClass().isArray();
 3 System.out.println(isArray);
 4 //2-直接创建Object数组,通过Array.getLength()获取长度
 5 Object integerArray = Array.newInstance(Integer.class,8);
 6 Array.set(integerArray,0,88);
 7 int length = Array.getLength(integerArray);
 8 int lenght2 = Array.getLength(integers);
 9 System.out.println("integers‘ length="+lenght2+";
10 nintegerArray‘s length="+length);
11 //3-反射获取数组的对象类型;
12 Class componenttype = integerArray.getClass().getComponentType();
13 System.out.println("integerArray‘s elment‘s type="+componenttype);

结果:

时间: 2024-10-12 19:59:01

利用反射动态操作数组的相关文章

MVVM下 利用反射动态创建ViewModel 实现单例

在MVVM一般情况下都会希望ViewModel 在整个应用程序中只有一份实例 传统的做法是用单例模式去实现 : public class ViewModelTest { private ViewModelTest() { } private static ViewModelTest viewModelInstace; public static ViewModelTest GetViewModelTestInstace() { if (viewModelInstace == null) { vi

利用反射动态加载程序集中所有的继承于Form的子类

利用C# 的反射,能够轻松快捷的创建指定类型的未知对象,比如继承某个接口的类,继承于某个基类的子类. 问题场景: 我自己创建一个解决方案,这个方案里面放了很多的小工具,每一个工具都是一个小窗体,于是,我就用一个MID窗体来包含这些窗体. 这样问题就来了,每一次我添加一个小工具,我就必须在MID窗体里面添加一个按钮,或者是一个菜单.在事件写上,让某个窗体显示出来.这类无聊的语句. 那么能不能让程序自动查找程序集中的窗体,自动创建按钮,或者菜单. 这样就可以达到动态创建的目的了 解决方案: 假设我们

C#利用反射动态调用DLL并返回结果,和获取程序集的信息

反射的基本概念: .Net Framework 中提供了反射机制,可以再加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息 创建Assembly和Entity两个程序集,在Assembly中添加Entity引用,如下图: namespace Entity { public class GetData { public static SIMPEntities SIMP = new SIMPEntities(); /// <summary> /// 查询方法--返回序列化json /

Django中利用type动态操作数据库表

场景分析: 后台MySql数据库保存了一大批按股票代码命名的数据表,每张表保存的是每只股票的日线数据. stock_000002 stock_600030 stock_600020 ...一共3000多个表. Django中如果要按股票代码展示每张表的数据,利用常规ORM模型变得非常困难,因为有3000多个表,就需要建3000多个模型. 解决办法: 1. 根据表名.字段等动态创建ORM表模型 def create_model(name, fields=None, app_label='', mo

利用反射,把数组里的数据变成指定类对象里的

朋友遇到的一个问题: 从文本里读出的字符串("张三","20"...),类型以字符串形式已知("string","int"....) 希望转换成类对象. 数据多的情况下,频繁使用反射有可能影响效率,故写了个小demo如下: Person类: 1 class Person 2 { 3 public string xm { get; set; } 4 public int nl { get; set; } 5 public voi

java利用反射扩展任意数组的方法

public static Object goodCopyOf(Object a,int newLength){//该方法可以 用来扩展任意类型的数组 Class cl = a.getClass(); if (!cl.isArray()) return null; Class componentType = cl.getComponentType(); int length = java.lang.reflect.Array.getLength(a); Object newArray = jav

利用反射动态创建实例并调用方法

在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例. 主要用途: 动态加载DLL,实现插件机制. 实例化DLL中的类型. 执行后期绑定,访问在运行时创建的类型的方法. 首先,新建一个空白解决方案:DllSolution 向解决方案中添加一个类库:RefDll,这将是需要被动态创建的程序集 重命名默认新建的Class1类:Student,这个类将是需要动态创建的类.

C# 利用反射动态将字符串转换成属性对应的类型值

/// <summary> /// 为指定对象分配参数 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="dic">字段/值</param> /// <returns></returns> private T Assign<T>(Dictionary<stri

[译文]运行时利用反射动态地创建类的实例

介绍 通常我们使用类的名称创建一个实例/类的对象,例如,如果我有一个名为 User 的类,我们会去这样创建这个类. 1 User UR = new User(); 2 UR.ID = 1; 3 UR.Name = "Kailash"; 但如果有人你在让你在应用程序运行时或者通过字符串作为类名创建一个类的实例,你将如何做? 别担心,微软.Net 框架提供了一种解决方案. 在System.Reflection名称空间的 Assembly类和System名字空间的和Activator 类可以