zoukankan      html  css  js  c++  java
  • java反射调用main方法踩坑

    被调用类

    import java.util.Arrays;
    
    public class TestMain {
    
      public static void main(String[] args) {
        System.out.println("TestMain");
      }
    
      public static void testA(String... names) {
        System.out.println("testA: " + Arrays.toString(names));
      }
    
      public void testB(String[] names) {
        System.out.println("testB: " + Arrays.toString(names));
      }
    
      public void testC(String... names) {
        System.out.println("testC: " + Arrays.toString(names));
      }
    
      public void testD(Object... objects) {
        System.out.println("testD: " + Arrays.toString(objects));
      }
    }
    

    调用类

    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class Client2 {
    
      public static void main(String[] args)
          throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class<TestMain> aClass = TestMain.class;
        Method mainMethod = aClass.getDeclaredMethod("main", String[].class);
        //错误
        //mainMethod.invoke(null, new String[]{});
        //第一种方法
        mainMethod.invoke(null, (Object) new String[]{});
        //第二种方法
        mainMethod.invoke(null, new Object[]{new String[]{}});
        Method testAMethod = aClass.getDeclaredMethod("testA", String[].class);
        testAMethod.invoke(null, (Object) new String[]{"a"});
        Method testBMethod = aClass.getDeclaredMethod("testB", String[].class);
        testBMethod.invoke(new TestMain(), (Object) new String[]{"b"});
        Method testCMethod = aClass.getDeclaredMethod("testC", String[].class);
        testCMethod.invoke(new TestMain(), (Object) new String[]{"c"});
        //解析成多个参数
        new TestMain().testD(new String[]{"d", "e"});
        //解析成一个参数
        new TestMain().testD((Object) new String[]{"d", "e"});
      }
    
    }
    

    输出为

    TestMain
    TestMain
    testA: [a]
    testB: [b]
    testC: [c]
    testD: [d, e]
    testD: [[Ljava.lang.String;@6c3708b3]
    

    反射调用静态方法时,第一个参数为 null,当参数类型为数组或可变参数时,调用时必须将数组类型转换为Object

    (Object) new String[]{}
    

    或使用Object数组包装一层

    new Object[]{new String[]{}}
    

    不然会报错,参数类型不匹配

    Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    	at com.imooc.sourcecode.java.javacompile.test5.Client2.main(Client2.java:17)
    

    这是因为jdk1.4和1.5中的Method类设计有区别,1.4如下

    public Object invoke(Object obj, Object[] args)
    

    1.5如下

    public Object invoke(Object obj, Object... args)
    

    参数类型从数组变成了可变参数,如果直接传递new String[]{}参数,jdk1.4下会转换成多个参数,jdk1.5下是一个参数,jdk会向下兼容1.4,我们为了让编译器正确的解析参数,需要做上述两种转换,转换为 Object,或使用 Object数组包装一下。

  • 相关阅读:
    HLSL定义float4 Pos:POSITION的寄存器绑定问题(Render Monkey)
    Chapter 9-May There Be Light之点光源及其衰减
    Chapter 15-Watch Out for That Morning Fog之体积雾及体积雾场景混合
    Chapter 12-Not All Materials Are the Same
    Chapter 11-Mirror, Mirror, On the Wall之反射跟折射
    Render Monkey中可渲染纹理的Clear Color
    Chapter8-Making Your Day Brighter之使用Non-floating Texture来实现HDR特效
    Chapter8-Making Your Day Brighter之Lens Flare & put all together
    Chapter8-Making Your Day Brighter之The Streak
    Chapter8-Making Your Day Brighter之Your First HDR Shader: The Glare!
  • 原文地址:https://www.cnblogs.com/strongmore/p/14925064.html
Copyright © 2011-2022 走看看