Динамично вызывая любую функцию путем передачи имени функции как строки

Как избежать кода Java в JSP-файлах?

В дополнение к языку выражений (EL) вы можете использовать теги библиотеки табуляции, такие как JSTL. Но EL не работает с JSP. Так что, вероятно, лучше полностью отказаться от JSP и использовать Facelets.

Facelets - это первый язык декларации страницы без JSP, предназначенный для JSF (Java Server Faces), который предоставил разработчикам JSF более простую и более мощную модель программирования сравнить с JSP. Он решает различные проблемы, возникающие в JSP для разработки веб-приложений.

25
задан Josh 29 April 2009 в 06:43
поделиться

4 ответа

Do you just want to call a parameterless constructor to create the instance? Is the type specified as a string as well, or can you make it a generic method? For example:

// All error checking omitted. In particular, check the results
// of Type.GetType, and make sure you call it with a fully qualified
// type name, including the assembly if it's not in mscorlib or
// the current assembly. The method has to be a public instance
// method with no parameters. (Use BindingFlags with GetMethod
// to change this.)
public void Invoke(string typeName, string methodName)
{
    Type type = Type.GetType(typeName);
    object instance = Activator.CreateInstance(type);
    MethodInfo method = type.GetMethod(methodName);
    method.Invoke(instance, null);
}

or

public void Invoke<T>(string methodName) where T : new()
{
    T instance = new T();
    MethodInfo method = typeof(T).GetMethod(methodName);
    method.Invoke(instance, null);
}
47
ответ дан 28 November 2019 в 17:56
поделиться

Чтобы вызвать конструктор, Activator.CreateInstance сделает свое дело. Он имеет множество перегрузок, чтобы сделать вашу жизнь проще.

Если ваш конструктор без параметров :

object instance = Activator.CreateInstance(type)

Если вам нужно параметров :

object instance =  Activator.CreateInstance(type, param1, param2)

Для вызова метода, Если у вас есть объект Type , вы можете вызвать GetMethod , чтобы получить метод , а затем Invoke (с или без параметры), чтобы вызвать его. Если вам это нужно, Invoke также выдаст вам возвращаемое значение функции, которую вы вызываете (или NULL, если это метод void),

Для более подробного примера (вставьте в консольное приложение и перейдите ):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;

namespace Test
{
    public static class Invoker
    {
        public static object CreateAndInvoke(string typeName, object[] constructorArgs, string methodName, object[] methodArgs)
        {
            Type type = Type.GetType(typeName);
            object instance = Activator.CreateInstance(type, constructorArgs);

            MethodInfo method = type.GetMethod(methodName);
            return method.Invoke(instance, methodArgs);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Default constructor, void method
            Invoker.CreateAndInvoke("Test.Tester", null, "TestMethod", null);

            // Constructor that takes a parameter
            Invoker.CreateAndInvoke("Test.Tester", new[] { "constructorParam" }, "TestMethodUsingValueFromConstructorAndArgs", new object[] { "moo", false });

            // Constructor that takes a parameter, invokes a method with a return value
            string result = (string)Invoker.CreateAndInvoke("Test.Tester", new object[] { "constructorValue" }, "GetContstructorValue", null);
            Console.WriteLine("Expect [constructorValue], got:" + result);

            Console.ReadKey(true);
        }
    }

    public class Tester
    {
        public string _testField;

        public Tester()
        {
        }

        public Tester(string arg)
        {
            _testField = arg;
        }

        public void TestMethod()
        {
            Console.WriteLine("Called TestMethod");
        }

        public void TestMethodWithArg(string arg)
        {
            Console.WriteLine("Called TestMethodWithArg: " + arg);
        }

        public void TestMethodUsingValueFromConstructorAndArgs(string arg, bool arg2)
        {
            Console.WriteLine("Called TestMethodUsingValueFromConstructorAndArg " + arg + " " + arg2 + " " + _testField);
        }

        public string GetContstructorValue()
        {
            return _testField;
        }
    }
}
20
ответ дан Nader Shirazie 15 October 2019 в 15:05
поделиться

Assuming that the method you want to invoke does not take any parameters:

public void InvokeMethod(Type type, string methodName)
{
    object instance = Activator.CreateInstance(type);
    MethodInfo method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);

    method.Invoke(instance, null);
}
7
ответ дан 28 November 2019 в 17:56
поделиться

Я думаю, что ваша проблема здесь слишком общая, я предлагаю решение с некоторыми допущениями здесь.

Предположение: у вас есть typeName (строка), methodName (строка) и Параметр (SomeType).

public static void InvokeMethod(string typeName, string methodName, SomeType objSomeType) {
      Type type = Type.GetType(typeName);
      if(type==null) {
        return;
      }
      object instance = Activator.CreateInstance(type); //Type must have a parameter-less contructor, or no contructor.   
      MethodInfo methodInfo =type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public);
      if(methodInfo==null) {
        return;
      }
      methodInfo.Invoke(instance, new[] { objSomeType });  
    } 

, дайте мне знать, если мои предположения неверны.

3
ответ дан 28 November 2019 в 17:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: