栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

反射传人多参数方法

文章目录
  • 反射传人多参数方法
  • 一、单个方法传入多参数?
    • 1.创建一个方法
    • 2.创建一个调用方法的主方法
  • 二丶读取本地文件的方式
  • 三丶强转来实现接口的方法
    • 1.写一个方法的接口
    • 2.写一个实现类方法
  • 注意(shorten commond line)
  • 总结

一、单个方法传入多参数? 1.创建一个方法
package com.system.modules.admin.product.service;
import java.util.Arrays;


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;


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不存在

总结

今日诗句
会当凌绝顶,一览众山小

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/892043.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号