如何从getConstructor()中使用.class? - Java

时间:2015-02-05 02:58:37

标签: java api class events types

在java中,我正在为我正在开发的软件开发一个API,它允许人们自己扩展软件。现在,我正在使用一个事件系统,这很好。我试图使用.class来获取所需的参数类型,以便函数运行。是否有任何代码可用于从构造函数中获取变量(例如,具有类目录的字符串)然后创建它以便我可以使用.class?我很想知道!

注意:如果某些变量或构造函数看起来不像来自java,那可能是因为它们是我正在处理的API的一部分。

这是我的代码:

private void throwEvent() {
    PSLPE = new PocketServerListPingEvent(this, Packet.getAddress(), Packet.getPort(), ServerSettings.getPEMOTD());
    ArrayList<Class<?>> Listeners = PluginManager.getListeners();
    for(int i = 0; i < Listeners.size(); i++) {
        Method[] MethodList = Listeners.get(i).getMethods();
        for(int j = 0; j < MethodList.length; j++) {
            if(MethodList[j].isAnnotationPresent(EventHandler.class)) {
                if(MethodList[j].getParameters()[0].getType().equals(PocketServerListPingEvent.class)) {
                    try {
                        Class<?> EventClass = Class.forName(Listeners.get(i).getName());
                        Constructor<?>[] EventCtorList = EventClass.getConstructors();
                        for(int k = 0; k < EventCtorList.length; k++) {
                            Constructor<?> ctor = EventClass.getConstructor(Class.forName(EventClass.getConstructors()[k].getParameters()[0].getType().toString().substring(6)));
                            Object EventObject = ctor.newInstance(EventClass.getConstructors()[k].getParameters()[0].getType());
                            Method EventMethod = EventObject.getClass().getMethod(MethodList[j].getName(), PocketServerListPingEvent.class);
                            EventMethod.invoke(EventObject, PSLPE);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您正在寻找Class.forName

它返回具有给定名称的类的Class对象,或者如果没有这样的类则抛出异常。例如:

Class<?> chillyDogsClass = Class.forName("net.codeguys.ChillyDogs");

String className = new Scanner(System.in).readLine();
try {
    Class<?> unknownClass = Class.forName(className);
    System.out.println("Successfully found " + unknownClass.toString());
} catch(ClassNotFoundException e) {
    System.out.println(className+" doesn't exist!");
}