反射获取方法传入多参数方法

反射传人多参数方法

一、单个方法传入多参数?

1.创建一个方法

package com.system.modules.admin.product.service;
import java.util.Arrays;

/**
 * @author xiaole
 */
public class Test3 {
    public void method(Object... objs) {
        System.out.println(Arrays.deepToString(objs));
    }
}

2.创建一个调用方法的主方法

package com.system.modules.admin.product.service;
import java.lang.reflect.Array;
import java.lang.reflect.Method;


public class Reflect {
    public static void main(String[] args) throws Exception {
        String className = "com.system.modules.admin.product.service.Test3";
        Class clazz = Class.forName(className);
        Test3 test3 = (Test3) clazz.newInstance();
        //Method method = clazz.getDeclaredMethod("method", Object[].class);
        Method method = clazz.getDeclaredMethod("method", Array.newInstance(Object.class, 0).getClass());
        method = clazz.getDeclaredMethod("method", (new Object[0]).getClass());
//        Method[] declaredMethods = clazz.getDeclaredMethods();//多个方法获取
        Object[] objects = {1, "fuck"};
        method.invoke(test3, new Object[]{ objects });
    }
}

二丶读取本地文件的方式

上面第一个方法拿来改下对象名就可以用

package com.system.modules.admin.product.service;
import cn.hutool.core.compiler.JavaSourceCompiler;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.resource.StringResource;
import cn.hutool.core.util.ClassLoaderUtil;
import java.lang.reflect.Array;
import java.lang.reflect.Method;


public class Test2 {
    public static void main(String[] args) throws Exception{
        String s = FileUtil.readUtf8String("E:\\opt\\Test1.java");
        Class<?> clazz = ss(s);
        Test1 test1 = (Test1) clazz.newInstance();
        //Method method = clazz.getDeclaredMethod("don", Object[].class);
        Method method = clazz.getDeclaredMethod("don", Array.newInstance(Object.class, 0).getClass());
        method = clazz.getDeclaredMethod("don", (new Object[0]).getClass());
//        Method[] declaredMethods = clazz.getDeclaredMethods();//多个方法获取
        Object[] objects = {1, "fuck"};
        method.invoke(test1, new Object[]{ objects });
    }

    private static Class<?> ss(String srcCode) throws ClassNotFoundException {
        ClassLoader classLoader = JavaSourceCompiler.create(ClassLoaderUtil.getClassLoader())
                .addSource(new StringResource(srcCode, CompileUtil.getFullClassName(srcCode)))
                .compile();
        return classLoader.loadClass(CompileUtil.getFullClassName(srcCode));
    }
}

三丶强转来实现接口的方法

1.写一个方法的接口

package com.system.modules.admin.product.service;

import java.util.Arrays;

public interface Test0 {
    public void don(Object...objects);
}

2.写一个实现类方法

package com.system.modules.admin.product.entity;

import com.system.modules.admin.product.service.Test0;

import java.util.Arrays;

/**
 * @author Administrator
 */
public class Test1 implements Test0 {

    @Override
    public void don(Object... objects) {
        System.out.println(Arrays.deepToString(objects));
    }
}
package com.system.modules.admin.product.service;
import cn.hutool.core.compiler.JavaSourceCompiler;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.resource.StringResource;
import cn.hutool.core.util.ClassLoaderUtil;
import java.lang.reflect.Array;
import java.lang.reflect.Method;


public class Test2 {
    public static void main(String[] args) throws Exception{
//      String className = "com.system.modules.admin.product.entity.Test1";
        String s = FileUtil.readUtf8String("E:\\opt\\Test1.java");
        Class<?> clazz = get1(s);
        Test0 obj = (Test0)clazz.newInstance();
        //Method method = clazz.getDeclaredMethod("don", Object[].class);
//        Method method = clazz.getDeclaredMethod("don", Array.newInstance(Object.class, 0).getClass());
//        method = clazz.getDeclaredMethod("don", (new Object[0]).getClass());
        Method[] declaredMethods = clazz.getDeclaredMethods();//多个方法获取
        Object[] objects = {1, "fuck"};
//        method.invoke(obj, new Object[]{ objects });
        obj.don(objects);
    }
    private static Class<?> get1(String srcCode) throws ClassNotFoundException {
        ClassLoader classLoader = JavaSourceCompiler.create(ClassLoaderUtil.getClassLoader())
                .addSource(new StringResource(srcCode, CompileUtil.getFullClassName(srcCode)))
                .compile();
        return classLoader.loadClass(CompileUtil.getFullClassName(srcCode));
    }
}

注意(shorten commond line)

none:这是默认选项。IDE不会缩短长类路径。如果命令行超出操作系统限制,则IDEA将无法运行您的应用程序
jar manifest:IDE通过临时classpath.jar传递长类路径。原始类路径在MANIFEST.MF中定义为classpath.jar中的类路径属性
classpath file:IDE将把长类路径写入文本文件

jar manifest会导致程序包com.system.modules.admin.product.service不存在


如果对你有帮助,麻烦点赞支持一下,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值