【问题标题】:Dynamic class loading with Java使用 Java 动态加载类
【发布时间】:2011-11-05 10:37:53
【问题描述】:

我想动态加载一个实现接口的具体类。输入:具体的类名。

我需要在这个具体类中调用一个方法,也就是说,我需要设置:

MyInterface myclass = new concreteClassName();
myclass.function();

我怎样才能做到这一点?

【问题讨论】:

  • 注意class是一个java关键字,你不能命名你的变量类
  • 动态加载是什么意思?
  • @amil : 我现在编辑了它,这只是一个例子
  • @umbr : 动态加载一个类,意味着在运行时用一个类标识符加载它,而不是实例化普通的构造函数,它在很多情况下很有用

标签: java reflection dynamic


【解决方案1】:

看看Class.forName(String)

    String str = "Test$B"; //your full class name here instead of Test$B
    A clazz = null; //change A to be your interface
    try { 
    clazz = (A)Class.forName(str).newInstance(); //change A to be your interface

    } catch (Exception e) { 
        //TODO: handle exceptions
        e.printStackTrace();
    }
    if (clazz != null)  {
        clazz.foo();
    }

【讨论】:

    【解决方案2】:

    你检查了吗

    try {
         // Load class
         Class<?> cls = Class.forName("my.package.ConcreteClass");
    
         // Instantiate object from class using default constructor
         my.package.ConcreteClass obj = (my.package.ConcreteClass) cls.newInstance(); 
    
         // Execute method on it
         obj.myMethod(); 
    } catch (Exception e) {
        throw new RuntimeException("Could not instantiate class", e);
    }
    

    以及Class#forNameClass#newInstance 各自的javadoc 条目?

    【讨论】:

    • 但是我想通过接口调用我的类而不是直接调用my.package.ConcreteClass
    【解决方案3】:

    你应该实现你自己的ClassLoader

    【讨论】:

    • 这将是我最后的选择,但我认为有更简单的解决方案
    • 您可能会发现(通过 Google :) 已经存在具有该功能的库
    猜你喜欢
    • 2011-02-19
    • 2011-04-04
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多