`
啸笑天
  • 浏览: 3466024 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

23对接收数组参数的成员方法进行反射24 数组与Object的关系及其反射类型25 数组的反射应用

 
阅读更多

 

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[]没有父子关系,ObjectString有父子关系,所以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));a4String []jdk1.4可以处理,所以得到了每个的值,如果是a1时,即int[],他不是Object[] a,所以jdk1.4不能处理,就交给了jdk1.5处理了,而jdk1.5int[]当做了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);

      }

   }

分享到:
评论

相关推荐

    Java反射机制2

    2. 对接收数组参数的成员方法进行反射: 反射不仅可以调用不带数组参数的方法,还可以处理带数组参数的方法。使用Method类的invoke()方法时,如果方法参数包含数组,我们需要将数组作为Object类型的参数传递,注意...

    Java基础学习教程(附PPT和源代码)

    配置eclispe的编译与运行环境rar在eclispe中配置java模板代码.rar在eclipse中导入已有的工程.rarjava5的静态导入与...对接收数组参数的成员方法进行反射....数组与Object的关系及其反射类型.rar数组的反射应用.rar

    java反射机制学习(二):通过反射获取构造方法并实例化对象

    parameterTypes)`方法接收一个类型数组,对应于构造方法的参数类型。 反射机制在很多场景下都很有用,如插件框架、序列化、动态代理等。但是,由于反射操作通常涉及安全性问题和性能开销,因此在非必要时应谨慎...

    如何通过反射调用方法[参考].pdf

    5. `object[] parameters`:方法的参数列表,如果方法没有参数,则传递一个空数组。 接下来,如果方法需要参数,我们可以这样调用: ```csharp object[] args = new object[] {100.09, 184.45}; object result; ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    6.6.3 对类型进行版本控制时的虚方法的处理 第7章 常量和字段 7.1 常量 7.2 字段 第8章 方法 8.1 实例构造器和类(引用类型) 8.2 实例构造器和结构(值类型) 8.3 类型构造器 8.3.1 类型构造器的性能 8.4 ...

    Java安全漫谈 - 03.反射篇(3)1

    在反射中,当你需要调用一个包含可变长参数的方法时,可以将对应的数组类型(如`String[].class`)传递给`getConstructor`或`getMethod`。例如,要调用`ProcessBuilder`的`String... command`构造函数,你可以这样...

    java加强笔记

    对接接收数组参数的成员方法进行反射 - 当方法需要接收数组作为参数时,可以使用`Array.newInstance()`创建数组,并将其传递给反射调用的方法。 ##### 8. 数组与Object的关系及其反射类型 - 在Java中,数组也是一...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    6.6.3 对类型进行版本控制时的虚方法的处理 第7章 常量和字段 7.1 常量 7.2 字段 第8章 方法 8.1 实例构造器和类(引用类型) 8.2 实例构造器和结构(值类型) 8.3 类型构造器 8.3.1 类型构造器的性能 8.4 ...

    CLR.via.C#.(中文第3版)(自制详细书签)

    6.6.3 对类型进行版本控制时的虚方法的处理 第7章 常量和字段 7.1 常量 7.2 字段 第8章 方法 8.1 实例构造器和类(引用类型) 8.2 实例构造器和结构(值类型) 8.3 类型构造器 8.3.1 类型构造器的性能 8.4 操作...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    6.6.3 对类型进行版本控制时的虚方法的处理 第7章 常量和字段 7.1 常量 7.2 字段 第8章 方法 8.1 实例构造器和类(引用类型) 8.2 实例构造器和结构(值类型) 8.3 类型构造器 8.3.1 类型构造器的性能 8.4 ...

    object c语法总结

    - **复合数据类型**:Objective-C支持多种复合数据类型,包括数组(Array)、集合(Set)、字典(Dictionary)等,这些类型通常用于存储和管理多个值。 #### 数组 - **一维数组**:单个维度上的元素集合。 - **可变长度...

    [Java泛型和集合].(Java.Generics.and.Collections).Maurice.Naftalin&Philip.Wadler.文字版

    结合变长参数(Varargs)使用时,可以创建能够接收任意数量某种类型参数的方法,并以数组形式处理这些参数。泛型方法和变长参数的组合,提供了更高的代码灵活性和重用性。 #### 1.5 断言 断言是Java中的一种调试...

    通过反射实现Java下的委托机制代码详解

    5. `getParamTypes(Object[] params)`:这是一个辅助方法,用于将参数对象数组转换为参数类型的数组,这对于获取方法实例是必要的。 6. `getDstMethod(Class&lt;?&gt; srcClass, String methodName, Class[] paramTypes)`...

    PHP中把对象转换为关联数组代码分享

    关联数组是一种特殊的数组,它的索引是字符串类型,可以是键名,也可以是字符串值,用于存储一系列键值对,通常用于表示数据结构和存储对象属性。 要实现对象到关联数组的转换,首先需要理解PHP中的对象和数组的...

    Java极品学习资料

    - `main`方法是Java程序的入口点,参数`String[] args`用于接收命令行参数。 - 示例代码展示如何使用`args`传递和解析参数。 **&和&&的区别** - `&`:逻辑与操作符,用于位运算和布尔表达式。 - `&&`:短路与操作符...

    打印自定义复杂对象工具类

    1. **`printObject(Object obj)`**:这是主要的打印方法,接收一个任意类型的对象作为参数。它会递归地遍历对象的所有字段,包括基本类型、引用类型(其他对象)、集合和数组,将它们以易于阅读的方式打印出来。 2....

    C#使用手册.新手必备学习资料

    Main()方法是程序的入口点,可以接收命令行参数。控制台I/O用于读写控制台,注释用于解释代码,预处理器指令如#define、#if等用于编译时的条件处理,遵循一定的编程规则和约定。 第三章深入到对象和类型的细节。C#...

    疯狂JAVA讲义

    学生提问: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 ...

    Java经典问题答案(带书签).pdf

    - 可变参数允许一个方法接受不定数量的相同类型参数。 - 定义在最后是为了确保方法调用时参数顺序正确。 **绝对路径和相对路径的区别** - 绝对路径是从根目录开始的完整路径。 - 相对路径是从当前目录开始的路径,...

    关于C#基础知识回顾--反射(三)

    除了实例化对象,反射还可以用来访问和调用类的成员方法。比如在`MyClass`中有多个`Set`方法,我们可以使用`GetMethod()`来获取特定的方法信息,然后调用`Invoke()`来执行这些方法。 ```csharp MethodInfo set...

Global site tag (gtag.js) - Google Analytics