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