Java 如何使用用户给定的参数调用静态方法(反射)

Java 如何使用用户给定的参数调用静态方法(反射),java,reflection,method-invocation,Java,Reflection,Method Invocation,我创建了一个应用程序,它显示:类的方法、字段、构造函数(由用户aJTextField键入)。它将这些方法、字段和构造函数添加到三个独立的jlist。 我想让用户能够从列表中选择一个metod,然后调用它(仅限于参数类型为String或int的方法) 我不知道如何获取该方法需要多少参数的信息,然后每个参数是什么类型(String或int),以及如何将它们传递给方法。调用(参数) 工作守则: import java.awt.BorderLayout; import java.awt.Color; i

我创建了一个应用程序,它显示:类的方法、字段、构造函数(由用户a
JTextField
键入)。它将这些方法、字段和构造函数添加到三个独立的
jlist
。 我想让用户能够从列表中选择一个metod,然后调用它(仅限于参数类型为
String
int
的方法)

我不知道如何获取该方法需要多少参数的信息,然后每个参数是什么类型(
String
int
),以及如何将它们传递给
方法。调用(参数)

工作守则:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;

public class Zadanie extends JFrame {
    JList<Method> mList;
    JList<Field> fList;
    JList<Constructor> cList;
    DefaultListModel<Method> modelM;
    DefaultListModel<Field> modelF;
    DefaultListModel<Constructor> modelC;
    JTextField txt;
    JButton buttonOK, buttonReset;
    JPanel centerPanel, topPanel, buttonPanel;
    boolean reseted;

    public Zadanie() {
        reseted = true;
    }


    public void createGUI() {
        setSize(800, 600);

        add(topPanel = new JPanel(new BorderLayout()), BorderLayout.NORTH);
        topPanel.add(txt = new JTextField("Person"), BorderLayout.CENTER);
        topPanel.add(buttonPanel = new JPanel(new GridLayout(1, 2)), BorderLayout.EAST);
        buttonPanel.add(buttonOK = new JButton("OK"));
        buttonPanel.add(buttonReset = new JButton("RESET"));
        topPanel.setBorder(new LineBorder(Color.red, 1));
        add(centerPanel = new JPanel(new GridLayout(3, 1)), BorderLayout.CENTER);
        centerPanel.setBorder(new LineBorder(Color.green, 1));

        modelM = new DefaultListModel<Method>();
        modelF = new DefaultListModel<Field>();
        modelC = new DefaultListModel<Constructor>();

        centerPanel.add(new JScrollPane(mList = new JList<Method>(modelM), JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS));
        centerPanel.add(new JScrollPane(fList = new JList<Field>(modelF), JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS));
        centerPanel.add(new JScrollPane(cList = new JList<Constructor>(modelC), JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS));

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        createListeners();
        setVisible(true);
    }

    private void createListeners() {
        txt.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                buttonOK.doClick();
            }
        });

        buttonOK.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    if (reseted) {//szukanie klasy
                        reseted = false;
                        Class<?> fetchedClass = Class.forName(txt.getText());
                        Method[] methods = fetchedClass.getDeclaredMethods();
                        System.out.println(methods.length);
                        for (Method method : methods) {
                            modelM.addElement(method);

                        }
                        Field[] fields = fetchedClass.getFields();
                        for (Field field : fields) {
                            modelF.addElement(field);
                        }
                        Constructor[] constructors = fetchedClass.getConstructors();
                        for (Constructor constructor : constructors) {
                            modelC.addElement(constructor);
                        }

                    } else {//odpalanie metod

                    }
                } catch (ClassNotFoundException e1) {
                    reseted = true;
                    e1.printStackTrace();
                }
            }
        });

        buttonReset.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                reseted = true;
                modelM.clear();
                modelF.clear();
                modelC.clear();
            }
        });

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Zadanie().createGUI();

            }
        });

    }

}

class Person {
    int age;
    String name;

    public Person(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }

    public void doSth(){
        System.out.println("Do sth  1");
    }

    public void doSth(int a){
        System.out.println("Do sth 2");
    }

    public void doSth(String s){
        System.out.println("Do sth  3");
    }

    public static void doSthStatic(){
        System.out.println("Do sth static");
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Osoba [age=" + age + ", name=" + name + "]";
    }

    public static void main(String[] args) {
        Person o = new Person(42, "fas");
        System.out.println(o.getClass().getCanonicalName());
    }

}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.lang.reflect.Constructor;
导入java.lang.reflect.Field;
导入java.lang.reflect.Method;
导入javax.swing.DefaultListModel;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JList;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextField;
导入javax.swing.SwingUtilities;
导入javax.swing.border.LineBorder;
公共类Zadanie扩展JFrame{
JList-mList;
JList-fList;
JList-cList;
模型m;
DefaultListModelF;
模型c;
JTextField-txt;
JButton buttonOK,buttonReset;
JPanel中心面板、顶部面板、按钮面板;
布尔重置;
公共扎达尼(){
重置=真;
}
public void createGUI(){
设置大小(800600);
添加(topPanel=newjpanel(newborderlayout()),BorderLayout.NORTH);
add(txt=newjtextfield(“Person”),BorderLayout.CENTER);
add(buttonPanel=newjpanel(newgridlayout(1,2)),BorderLayout.EAST);
add(buttonOK=newjbutton(“确定”);
添加(buttonReset=newjbutton(“重置”);
topPanel.setBorder(新线条边框(颜色为红色,1));
添加(centerPanel=newjpanel(newgridlayout(3,1)),BorderLayout.CENTER;
centerPanel.setBorder(新线条边框(颜色为绿色,1));
modelM=新的DefaultListModel();
modelF=新的DefaultListModel();
modelC=新的DefaultListModel();
添加(新建JScrollPane(mList=new JList(modelM),JScrollPane.VERTICAL\u SCROLLBAR\u ALWAYS,JScrollPane.HORIZONTAL\u SCROLLBAR\u ALWAYS));
添加(新的JScrollPane(fList=new JList(modelF),JScrollPane.VERTICAL\u SCROLLBAR\u ALWAYS,JScrollPane.HORIZONTAL\u SCROLLBAR\u ALWAYS));
添加(新的JScrollPane(cList=new JList(modelC),JScrollPane.VERTICAL\u SCROLLBAR\u ALWAYS,JScrollPane.HORIZONTAL\u SCROLLBAR\u ALWAYS));
setDefaultCloseOperation(关闭时退出);
createListeners();
setVisible(真);
}
私有void createListeners(){
addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件arg0){
按钮ok.doClick();
}
});
addActionListener(新建ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
试一试{
如果(重置){//szukanie klasy
重置=错误;
类fetchedClass=Class.forName(txt.getText());
方法[]方法=fetchedClass.getDeclaredMethods();
System.out.println(方法.长度);
用于(方法:方法){
模型M.补充元素(方法);
}
Field[]fields=fetchedClass.getFields();
用于(字段:字段){
模型F.补遗(字段);
}
构造函数[]构造函数=fetchedClass.getConstructors();
for(构造函数:构造函数){
模型C.补遗(建造商);
}
}else{//odpalanie metod
}
}捕获(ClassNotFoundException e1){
重置=真;
e1.printStackTrace();
}
}
});
buttonReset.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件arg0){
重置=真;
modelM.clear();
modelF.clear();
modelC.clear();
}
});
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
新建Zadanie().createGUI();
}
});
}
}
班主任{
智力年龄;
字符串名;
公众人物(整数年龄,字符串名称){
超级();
这个。年龄=年龄;
this.name=名称;
}
公开无效doSth(){
系统输出打印(“做某事1”);
}
公共无效文件(int a){
系统输出打印(“做某事2”);
}
公共无效doSth(字符串s){
系统输出打印(“做某事3”);
}
公共静态void doSthStatic(){
系统输出打印(“做某事静态”);
}
公共整数getAge(){
回归年龄;
}
公共无效设置(整数){
这个。年龄=年龄;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
@凌驾
公共字符串toString(){
返回“Osoba[age=“+age+”,name=“+name+”]”;
}
公共静态void main(字符串[]args){
人员o=新人员(42,“fas”);
System.out.println(o.getClass().getCanonicalName());
}
}
这可能会对您有所帮助

public class Sample {
public String appendStrings(String a,String b) {
     return a.concat(b);
 }
}
现在我要调用
public class Test {

public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
   Sample sample=new Sample();
    Method method=Sample.class.getDeclaredMethod("appendStrings", String.class, String.class);
    System.out.println(method.invoke(sample, "Hello", "World"));
}
 HelloWorld
org.apache.commons.lang.reflect.MethodUtils.invokeExactStaticMethod(Class class, String methodName,  Object[] arguments)