我如何使用Class.forName()的构造函数

时间:2015-03-22 18:00:11

标签: java minecraft

问题是当我为Minecraft服务器构建插件时。由于这是我的业务,​​这些包总是按不同版本更改,例如net.minecraft.1_8R1,但内部的类文件永远不会更改。所以我试图通过Class.forName("net.minecraft." + getVersion() + "PacketPlayOutTitle")找到班级。我已经制作了自己的getVersion()方法。但是如何在不导入的情况下使用此PacketPlayOutTitle构造函数,那么我的插件将与不同版本的服务器兼容。拜托,谢谢。

1 个答案:

答案 0 :(得分:1)

使用反射。

Class<?> packetClass = Class.forName("net.minecraft." + getVersion() + "PacketPlayOutTitle");
Object packet = packetClass.newInstance();

编辑:以下是没有导入的示例。使用反射调用方法。

public class Bar {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //find class
        Class<?> fooClass = Class.forName("foo.Foo");

        //find constructor for given arguments
        Constructor<?> fooConstructor = fooClass.getConstructor(String.class, int.class);

        //call constructor
        Object foo = fooConstructor.newInstance("FooBar", 100);

        //find method
        Method getFooMethod = fooClass.getDeclaredMethod("getFoo");
        Method setFooMethod = fooClass.getDeclaredMethod("setFoo", String.class);
        Method getBarMethod = fooClass.getDeclaredMethod("getBar");
        Method setBarMethod = fooClass.getDeclaredMethod("setBar", int.class);

        //call method
        Object fooResult = getFooMethod.invoke(foo);
        System.out.println(fooResult);

        Object barResult = getBarMethod.invoke(foo);
        System.out.println(barResult);

        setFooMethod.invoke(foo, "BarFoo");
        setBarMethod.invoke(foo, 200);

        fooResult = getFooMethod.invoke(foo);
        System.out.println(fooResult);

        barResult = getBarMethod.invoke(foo);
        System.out.println(barResult);
    }
}

public class Foo {
    private String foo;
    private int bar;

    public Foo(String foo, int bar) {
        this.foo = foo;
        this.bar = bar;
    }

    public String getFoo() {
        return foo;
    }

    public void setFoo(String foo) {
        this.foo = foo;
    }

    public int getBar() {
        return bar;
    }

    public void setBar(int bar) {
        this.bar = bar;
    }
}

这产生了输出:

FooBar
100
BarFoo
200