- 浏览: 3460173 次
- 性别:
- 来自: China
文章分类
- 全部博客 (536)
- ajax (1)
- Algorithm (14)
- Android (40)
- CSS/HTML... (2)
- defy (3)
- DesignPattern (2)
- dorado (0)
- Drools (6)
- English/日本語 (7)
- Flex (2)
- Framework (0)
- Google (3)
- hibernate (13)
- homework (3)
- HTML5 (0)
- IDE (29)
- java (45)
- javaee (7)
- Javascript (14)
- java组件 (5)
- jQuery (4)
- jsp (8)
- jsf (2)
- Linux (2)
- lucene (0)
- mysql (6)
- news (3)
- Oracle (8)
- other (4)
- PHP (5)
- Python (0)
- Software Engineering (3)
- spring (7)
- struts1.x (14)
- struts2.x (14)
- strolling in cloud (1)
- subject:javaEnhance (20)
- Tomcat (7)
- validator (3)
- 学习·方法·心得 (8)
- .NET (2)
- vba (6)
- groovy (5)
- grails (2)
- SWT (0)
- big data (1)
- perl (1)
- objective-c (50)
- product (1)
- mac (7)
- ios (188)
- ios-phone (2)
- ios-system (15)
- ios-network (5)
- ios-file (4)
- ios-db (1)
- ios-media (3)
- ios-ui (27)
- ios-openSource (6)
- ios-animation (5)
- ios-drawing (7)
- c (2)
- ios-app (2)
- ios-course (15)
- ios-runtime (14)
- ios-code (8)
- ios-thread (8)
- ios-LBS (2)
- ios-issue (1)
- ios-design (2)
- Jailbreak (2)
- cocos2d (0)
- swift (16)
- ios-framework (4)
- apple watch (4)
- ios-web (1)
- react native (3)
- TVOS (1)
- OpenGL (1)
最新评论
-
xiaobinggg:
...
Session机制详解 -
菜鸟学生会:
Drools规则工作流引擎开发教程网盘地址:http://pa ...
Drools入门-----------环境搭建,分析Helloworld -
wangyudong:
不是很好用,不支持自动化测试RESTful API,也不支持自 ...
Simple REST Client POST使用方法 -
Paul0523:
很棒的一篇文章,感谢楼主分享
Session机制详解 -
啸笑天:
获取原型对象的三种方法<script>functi ...
复习JavaScript面向对象技术
23对接收数组参数的成员方法进行反射
package cn.zyj23.review; import java.lang.reflect.Method; public class ReflectTest { public static void main(String[] args) throws Exception { //TestArguments.main(new String[]{"111","222","333"}); String startingClassName = args[0]; Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class); //mainMethod.invoke(null, new Object[]{new String[]{"111","222","333"}}); mainMethod.invoke(null, (Object)new String[]{"111","222","333"});//效果同上 } } class TestArguments{ public static void main(String[] args){ for(String arg : args){ System.out.println(arg); } } }
启动java程序的main方法的参数是一个字符串数组,即public static void main(String[] args),通过反射方式来调用这个main方法时,如何为invoke方法传递参数呢?按jdk1.5的语法,整个数组时一个参数,而jdk1.4的语法,数组中额度每个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac会到底按照哪种语法进行处理呢?jdk1.5肯定要兼容jdk1.4的语法,会按照jdk1.4的语法进行处理,即把数组打撒成为若干个单独的参数。所以在给main方法传递参数时,不能使用代码mainMethod.invoke(null, new String[]{"11","22","33"});javac只把他当做jdk1.4的语法进行理解,而不是jdk1.5,因此会出现参数类型不对的问题。
解决方法:
mainMethod.invoke(null, new Object[]{new String[]{"11","22","33"}});
mainMethod.invoke(null,(Object)new String[]{"11","22","33"});//编译器会做特殊处理,编译时不会吧参数当做数组看待,也就不会数组打撒成若干参数了
24 数组与Object的关系及其反射类型。
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().getName());//[I
System.out.println(a2.getClass().getName());//[I
System.out.println(a3.getClass().getName());//[[I
System.out.println(a4.getClass().getName());//[Ljava.lang.String;
1、具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象
System.out.println(a1.getClass() == a2.getClass());
//System.out.println(a1.getClass() == a4.getClass());//报错,看错误提示
//System.out.println(a1.getClass() == a3.getClass());//报错,看错误提示
2、代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
// getSuperclass
// public Class<? super T> getSuperclass()返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。如果此 Class 表示 Object 类、一个接口、一个基本类型或 void,则返回 null。如果此对象表示一个数组类,则返回表示该 Object 类的 Class 对象。
// 返回:
// 此对象所表示的类的超类。
System.out.println(a1.getClass().getSuperclass().getName());//java.lang.Object
System.out.println(a2.getClass().getSuperclass().getName());//java.lang.Object
System.out.println(a3.getClass().getSuperclass().getName());//java.lang.Object
System.out.println(a4.getClass().getSuperclass().getName());//java.lang.Object
Object obj1=a1;
Object obj2=a3;
Object obj3=a3;
Object obj4=a4;
3、基本类型的一位数组可以被当作Object类型使用,不能当做Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用也可以当做Object[]类型使用
//Object[] objs1=a1;//int的不是Object
//Object[] objs2=a2;
Object[] objs3=a3;//int[]是个Object对象
Object[] objs4=a4;//字符串数组里的字符串是Object,即Object数组里的Object
Object[] 与String[]没有父子关系,Object与String有父子关系,所以new Object[]{“aaa”,”bb”}不能强制转换成new String[]{“aaa”,”bb”};,Object x = “abc”能强制转换成String x = “abc”。
main.invoke(null, (Object)(new Object[]{“aaa”,“xxx”}));不能调用public static void main(String [] args)
4、Arrays.asList()(Arrays.deepToString())方法处理int[]和String[]时的差异。
jdk1.4 public static <T> List<T> asList(Object[] a)
jdk1.5 public static <T> List<T> asList(T... a)
为了考虑兼容性先给jdk1.4的运行,当jdk1.4不能处理时交由jdk1.5处理,例如System.out.println(Arrays.asList(a4));,a4为String [],jdk1.4可以处理,所以得到了每个的值,如果是a1时,即int[],他不是Object[] a,所以jdk1.4不能处理,就交给了jdk1.5处理了,而jdk1.5把int[]当做了Object对象处理了,得到了[[I@10b30a7]
System.out.println(Arrays.toString(a1));//[1, 2, 3]//public static String toString(int[] a)
System.out.println(Arrays.toString(a2));//[4]//public static String toString(int[] a)
System.out.println(Arrays.toString(a3));//[[I@14318bb, [I@ca0b6]//public static String toString(Object[] a)
System.out.println(Arrays.toString(a4));//[a, b, c]//public static String toString(Object[] a)
System.out.println(Arrays.asList(a1));//[[I@10b30a7]//jdk1.5 public static <T> List<T> asList(T... a)
System.out.println(Arrays.asList(a2));//[[I@1a758cb]//jdk1.5 public static <T> List<T> asList(T... a)
System.out.println(Arrays.asList(a3));//[[I@14318bb, [I@ca0b6]//jdk1.4 public static <T> List<T> asList(Object[] a)
System.out.println(Arrays.asList(a4));//[a, b, c]//jdk1.4 public static <T> List<T> asList(Object[] a)
25 数组的反射应用
1,Array工具类用于完成对数组的反射操作。
private static void printObject(Object obj){
Class cla=obj.getClass();
if (cla.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);
}
}
发表评论
-
43 通过反射获得泛型的实际类型参数
2011-12-24 00:01 1933public static void applyV ... -
42 自定义泛型类的应用
2011-12-23 09:50 1632l 如果类的实例对 ... -
40 自定义泛型方法及其应用41 自定义泛型方法的练习与类型推断总结
2011-12-23 09:49 164240 自定义泛型方法及其应用 l <!--[e ... -
38 泛型的通配符扩展应用39 泛型集合的综合应用案例
2011-12-23 09:49 124738 泛型的通配符扩展应用 泛型中的?通配符: l问 ... -
36 入门泛型的基本应用37 泛型的内部原理及更深应用
2011-12-23 09:49 118036 入门泛型的基本应用 <!--[if !su ... -
33了解和入门注解的应用34 注解的定义与反射调用35为注解增加各种属性
2011-12-23 09:49 163333 了解和入门注解 ... -
32 使用BeanUtils工具包操作JavaBean
2011-12-22 10:02 1534Beanutils工具包: l 演示用eclipse ... -
30-31内省访问JavaBean属性的两种方法
2011-12-22 10:02 223930 对JavaBean的简单内省操作 //pt ... -
29 由内省引出JavaBean的讲解
2011-12-22 10:02 1392IntroSpector内省—> ... -
28 用类加载器的方式管理资源和配置文件
2011-12-22 10:01 1523/*getRealPath();//金山词霸/内部 ... -
27框架的概念及用反射技术开发框架的原理
2011-12-21 09:38 1136反射的作用à实现框架功能 *框架与框架要解决的 ... -
解释equals(),hashcode()和==
2011-12-21 09:38 1605简单的结论:当对象类没有不符合规范的override e ... -
26 ArrayList_HashSet的比较及Hashcode分析
2011-12-21 09:38 1647只有类的实例对象要被采用哈希算法进行存储和检索时,这个类 ... -
18 理解反射的概念19构造方法的反射应用20成员变量的反射 21成员变量反射的综合案例22成员方法的反射
2011-12-21 09:37 151918 理解反射的概念 反射 一、反射就是Java类中 ... -
17 透彻分析反射的基础_Class类
2011-12-20 11:16 1403Java类用于描述一类事物的共性,该类事物有什么属性,没 ... -
12-16 jdk5枚举
2011-12-20 10:55 1290模拟枚举,其实枚举编译后就是如此: pac ... -
11 jdk5基本数据类型的自动拆箱与装箱
2011-12-20 10:36 1623package cn.zyj11.revie ... -
09jdk5可变参数与OverLoad;10java5的增加for循环
2011-12-20 10:34 1373package cn.zyj0910.review ... -
08 jdk5的静态导入
2011-12-20 10:31 1225import语句可以导入一个类或某个包中的所有类 im ...
相关推荐
2. 对接收数组参数的成员方法进行反射: 反射不仅可以调用不带数组参数的方法,还可以处理带数组参数的方法。使用Method类的invoke()方法时,如果方法参数包含数组,我们需要将数组作为Object类型的参数传递,注意...
配置eclispe的编译与运行环境rar在eclispe中配置java模板代码.rar在eclipse中导入已有的工程.rarjava5的静态导入与...对接收数组参数的成员方法进行反射....数组与Object的关系及其反射类型.rar数组的反射应用.rar
parameterTypes)`方法接收一个类型数组,对应于构造方法的参数类型。 反射机制在很多场景下都很有用,如插件框架、序列化、动态代理等。但是,由于反射操作通常涉及安全性问题和性能开销,因此在非必要时应谨慎...
5. `object[] parameters`:方法的参数列表,如果方法没有参数,则传递一个空数组。 接下来,如果方法需要参数,我们可以这样调用: ```csharp object[] args = new object[] {100.09, 184.45}; object result; ...
6.6.3 对类型进行版本控制时的虚方法的处理 第7章 常量和字段 7.1 常量 7.2 字段 第8章 方法 8.1 实例构造器和类(引用类型) 8.2 实例构造器和结构(值类型) 8.3 类型构造器 8.3.1 类型构造器的性能 8.4 ...
在反射中,当你需要调用一个包含可变长参数的方法时,可以将对应的数组类型(如`String[].class`)传递给`getConstructor`或`getMethod`。例如,要调用`ProcessBuilder`的`String... command`构造函数,你可以这样...
对接接收数组参数的成员方法进行反射 - 当方法需要接收数组作为参数时,可以使用`Array.newInstance()`创建数组,并将其传递给反射调用的方法。 ##### 8. 数组与Object的关系及其反射类型 - 在Java中,数组也是一...
6.6.3 对类型进行版本控制时的虚方法的处理 第7章 常量和字段 7.1 常量 7.2 字段 第8章 方法 8.1 实例构造器和类(引用类型) 8.2 实例构造器和结构(值类型) 8.3 类型构造器 8.3.1 类型构造器的性能 8.4 ...
6.6.3 对类型进行版本控制时的虚方法的处理 第7章 常量和字段 7.1 常量 7.2 字段 第8章 方法 8.1 实例构造器和类(引用类型) 8.2 实例构造器和结构(值类型) 8.3 类型构造器 8.3.1 类型构造器的性能 8.4 操作...
6.6.3 对类型进行版本控制时的虚方法的处理 第7章 常量和字段 7.1 常量 7.2 字段 第8章 方法 8.1 实例构造器和类(引用类型) 8.2 实例构造器和结构(值类型) 8.3 类型构造器 8.3.1 类型构造器的性能 8.4 ...
- **复合数据类型**:Objective-C支持多种复合数据类型,包括数组(Array)、集合(Set)、字典(Dictionary)等,这些类型通常用于存储和管理多个值。 #### 数组 - **一维数组**:单个维度上的元素集合。 - **可变长度...
结合变长参数(Varargs)使用时,可以创建能够接收任意数量某种类型参数的方法,并以数组形式处理这些参数。泛型方法和变长参数的组合,提供了更高的代码灵活性和重用性。 #### 1.5 断言 断言是Java中的一种调试...
5. `getParamTypes(Object[] params)`:这是一个辅助方法,用于将参数对象数组转换为参数类型的数组,这对于获取方法实例是必要的。 6. `getDstMethod(Class<?> srcClass, String methodName, Class[] paramTypes)`...
关联数组是一种特殊的数组,它的索引是字符串类型,可以是键名,也可以是字符串值,用于存储一系列键值对,通常用于表示数据结构和存储对象属性。 要实现对象到关联数组的转换,首先需要理解PHP中的对象和数组的...
- `main`方法是Java程序的入口点,参数`String[] args`用于接收命令行参数。 - 示例代码展示如何使用`args`传递和解析参数。 **&和&&的区别** - `&`:逻辑与操作符,用于位运算和布尔表达式。 - `&&`:短路与操作符...
1. **`printObject(Object obj)`**:这是主要的打印方法,接收一个任意类型的对象作为参数。它会递归地遍历对象的所有字段,包括基本类型、引用类型(其他对象)、集合和数组,将它们以易于阅读的方式打印出来。 2....
Main()方法是程序的入口点,可以接收命令行参数。控制台I/O用于读写控制台,注释用于解释代码,预处理器指令如#define、#if等用于编译时的条件处理,遵循一定的编程规则和约定。 第三章深入到对象和类型的细节。C#...
学生提问:Java为什么要对这些数据进行缓存呢? 67 3.7.6 逻辑运算符 67 3.7.7 三目运算符 68 3.7.8 运算符的结合性和优先级 69 3.8 本章小结 70 本章练习 70 第4章 流程控制和数组 71 4.1 顺序结构 72 4.2 ...
- 可变参数允许一个方法接受不定数量的相同类型参数。 - 定义在最后是为了确保方法调用时参数顺序正确。 **绝对路径和相对路径的区别** - 绝对路径是从根目录开始的完整路径。 - 相对路径是从当前目录开始的路径,...
除了实例化对象,反射还可以用来访问和调用类的成员方法。比如在`MyClass`中有多个`Set`方法,我们可以使用`GetMethod()`来获取特定的方法信息,然后调用`Invoke()`来执行这些方法。 ```csharp MethodInfo set...