加载类没有在Java中的一个特定的文件夹名称知道(load a class without know

2019-10-23 18:45发布

我有一个Java应用程序,做结果的文件,并释放输出一些操作。 我想补充一个属性,每个人都在使用我的应用程序可以添加他/她的具体操作。 并知道我要加载的类不知道它的名称或方法。

这是我的课,我知道可能被添加的类和方法名:

public class PathGetter {

public static void main(String[] args) {
    try{
        String AbsolutePath = args[0];
        AbsolutePath += "\\in.txt";

        String SecondFilePath = args[1];
        SecondFilePath += "\\out.txt";

        File file = new File(SecondFilePath);
        file.createNewFile();
        FileWriter writer = new FileWriter(file);

        FileReader fr = new FileReader();
        Object newOp = null;
        String newOpSign="!@#$%^&*";
        Method m = null;

        MathOperations mathOperations = new MathOperationsImpl();

        System.out.println("Do you have new operator? ");
        Scanner scanner1 = new Scanner(System.in); 

        if(scanner1.nextBoolean()==true){
            Scanner scanner2 = new Scanner(System.in);
            System.out.println("Enter operator sign: ");
            newOpSign = scanner2.nextLine();

            File addedClass= new File("E:\\workspace\\940420\\bin");

            URI uri = addedClass.toURI();
            URL[] urls = new URL[]{uri.toURL()};

            ClassLoader classLoader = new URLClassLoader(urls);

            Class clazz = classLoader.loadClass("second.MathOperationsUpdateImpl");   \\I don't know the class name might be added

            newOp = clazz.newInstance();    
            m = newOp.getClass().getMethod("mathOperate", String.class); \\I don't know the method name in added class

        }



        ArrayList<String> answer = new ArrayList<String>();

        for (int i = 0; i < fr.readFile(AbsolutePath).size(); i++) {
            if((fr.readFile(AbsolutePath).get(i)).contains(newOpSign)){

                answer.add(i,  String.valueOf(m.invoke(newOp,(fr.readFile(AbsolutePath).get(i)))));
            }
            else{
                answer.add(i, String.valueOf(mathOperations.mathOperate(fr.readFile(AbsolutePath).get(i))));
            }
        }

        for (int i = 0; i < fr.readFile(AbsolutePath).size(); i++) {
            writer.write(answer.get(i)+ "\r\n");
        }

        writer.close();

        System.out.print("Your File Successfully Created In: " + SecondFilePath);

    } catch (Exception e) {
        System.err.println("Error: " + e.getMessage());
    }
}   
}

Answer 1:

评论的综述,得到最终的答案:

1:如果你不知道的类名,你可以使用文件来获取目录的内容:

File d = new File("<knowDirectory>");
File[] f = d.listFiles();

当然,也应该只有一个.class目录中的文件。

2:所以,你知道的名称和类文件的路径。 加载它

Class c = Class.forName("<classname>").

比你能获得通过反射所有可用的方法,太:

Methods[] m = c.getMethods();

3(A):如果你不知道你要调用的方法,但它的签名(即,返回类型和参数)的名称,你可以使用m.getReturnType()m.getParameterTypes()看对于与所指定的签名的方法。 如果有多个,也没有办法来区分它们。 如果只有与签名一个方法只是用它(通过反射调用)。 像这样的事情(为返回类型Double和单参数String ):

Class<?>[] params = m.getParameterTypes();
Class<?> r = m.getReturnType();
if(r.getName().equals(Double.class.getName())
   && params.length == 1
   && params[0].getName().equals(String.class.getName()))
{
   // invoke
}

3(B):如果迫使用户执行一个抽象类(或接口),因此,你知道要实现的方法的名称,加载类和它投射到界面:

Class childClass = Class.forName("DerivedClassName");
MyAbstractClass userOperator = (MyAbstractClass)childClass.newInstance();


文章来源: load a class without knowing name in a specific folder in java