在类搜索路径中从jar加载并实例化类

时间:2015-12-03 10:17:57

标签: java classpath classloader

我正在寻找一种从类搜索路径中的jar文件中实例化对象的方法,我知道类的名称及其扩展的父类及其实现的接口,不幸的是我无法找到迄今为止的解决方案。 所以,假设如下:

sub change_cg_name {
  if(!-e $output_running) {
    print ("show running file not available. test case failed. [$output_running]");
    return 0;
  }
  if(!-e $bat_file_path) {
    print ("bat file not available test case filed. [$bat_file_path]");
    return 0
  }
  my $from_word=`grep 'config-group type node IMPT_' $bat_file_path  | awk '{print \$(4)}'`;
  my $to_word=  `grep 'config-group type node IMPT_' $output_running | awk '{print \$(4)}'`;
  print("from WORD IS [$from_word]");
  print("TO WORD IS [$to_word]");
  if($to_word ne "") {
    if (index($to_word, "IMPT_") != -1) {
      system("perl -i -p -e 's/"$from_word"/"$to_word"/ee' $bat_file_path");
      system("perl -p -i -e 's/\r\n$/\n/g' $bat_file_path");
      print("ARUL changed the impt name in the bat file [$to_word] and file [$bat_file_path]");
      return 0;
    }
  }
}

然后:

interface Modifier{
 //is basically just a flag
}

然后:

public class ModifierImpl implements Modifier{
 //some methods
}

这些接口/类进入了一个jar,我在我的项目中导入dinamically然后我想实例化public class CustomModifierImpl extends ModifierImpl{ //some implementation here } 的实例

因为我知道班级CustomModifierImpl是通用的,我认为类似的东西是可能的,但不是:

Class

当我这样做时,我得到了类型不匹配,有没有其他方法可以实现这一点?我不想在我的程序中使用private Class<ModifierImpl> loadClass(String fullClassName) { Class<ModifierImpl> clazz; try { clazz= urlLoader.loadClass(fullClassName); } catch (ClassNotFoundException e) { return null; } return clazz; } 的实例,因为我可能需要做几十个演员。

这也行不通:

Class<?>

谢谢

1 个答案:

答案 0 :(得分:2)

从.class文件加载类

File file2 = new File  ("c:\\myclasses\\");

// Convert File to a URL
URL url = file2.toURL();          // file:/c:/myclasses/
 URL[] urls = new URL[]{url};

// Create a new class loader with the directory
ClassLoader cl = new URLClassLoader(urls);

 // Load in the class; 
 Class cls = cl.loadClass("test.MyClass");

获得课程:

Class aClass;
ClassLoader classLoader = test.class.getClassLoader();
try {
    aClass = classLoader.loadClass(fullClassName);
   } catch (ClassNotFoundException e) {
   e.printStackTrace();
 }

一旦你上课了,你可以实例化它:

Class<?> clazz = Class.forName(fullClassName);
Constructor<?> constructor = clazz.getConstructor();
Object result = constructor.newInstance();