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