Maison  >  Questions et réponses  >  le corps du texte

面向对象编程 - java动态加载和类型转换问题?

我有 A1.java, A2.java, A3.java ... A10.java 等十个类(也许更多);

他们里面都有一个public static String getResponse()的方法,不过里面所做的事情和回复的字符串都不一样;

我还有一个变量 String name = "A1";,不确定变量里面的到底是哪一个类的名字,不过肯定是这是个类里面的一个。

我想当我收到这个name变量之后动态调用所对应的类的get
Response方法,而且不想用if-else一个个判断。

试了下下面的代码,forName回复的是一个class对象,好像不能强制类型转换。能转换也不知道到底转换成哪一个对象,我不想一个个if-else判断。

String result = Class.forName(name).getResponse();

我应该怎么做呢? 有没有好的建议?

大家讲道理大家讲道理2763 Il y a quelques jours524

répondre à tous(4)je répondrai

  • PHP中文网

    PHP中文网2017-04-18 10:57:19

    C'est l'utilisation de la réflexion Java.
    Vous devez d'abord obtenir l'objet Class d'une classe via Class.forName, puis obtenir l'objet méthode spécifié (Méthode) via la méthode getMethod de cet objet Class, et enfin via cet objet Method pour appeler cette méthode.
    Représenté dans le code source :

    public class Test {
        public static String getResponse() {
            return "This is Test.getResponse";
        }
    
        public static  void main(String[] args) throws Exception {
            String name = "com.test.Test";
            String methodName = "getResponse";
            Class<?> threadClazz = Class.forName(name);
            Method method = threadClazz.getDeclaredMethod(methodName);
            System.out.println(method.invoke(null));
        }
    }

    répondre
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:57:19

    class.forName obtient l'objet de classe. Ensuite, vous pouvez obtenir la méthode correspondante via la méthode getMethod de cet objet de classe. Invoquez ensuite la méthode correspondante

    répondre
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:57:19

    Toutes ces 10 classes peuvent-elles implémenter une interface, telle que

    public interface A0 {
        public String getResponse();
    }
    

    Alors A1, A2... sont tous implements A0 et implémentent getResponse (mais ils ne peuvent pas être définis comme statiques).

    Ensuite vous pouvez écrire :

    String result = ((A0) Class.forName(name).newInstance()).getResponse();

    répondre
    0
  • PHPz

    PHPz2017-04-18 10:57:19

    En plus de la réflexion, vous pouvez également utiliser Spring. Utilisez la chaîne obtenue pour obtenir un bean, puis appelez la méthode.

    répondre
    0
  • Annulerrépondre