如何使用类名作为方法参数的类型

时间:2016-04-06 12:27:45

标签: java reflection bukkit

我最近在尝试使用反射使我的一个bukkit插件版本独立时遇到了一些麻烦。 问题是,我知道如何使用它的名称来创建类的实例,但我不知道如何使用类名作为方法或构造函数参数的类型。换句话说,我想改变这个:

public class Foo{
private Goat goat;

public Foo(Goat goat){
  this.goat=goat;
}

这样的事情:

public class Foo{
private Class.forName("mypackage.Goat") goat;
public Foo(Class.forName("mypackage.Goat") goat){
  this.goat=goat;
}

老实说,我不知道它是否可能,但这对我的开发速度更快有很大帮助。

编辑:

我的情况比我之前提出的情况要复杂一些。这就是我无法实际使用泛型的原因。山羊'上面说明的I类实际上是一个我不知道的包内的类,所以我只知道类名。因此,我必须使用Class.forName方法以及检测当前bukkit版本的小算法并将其附加到我已经知道的包名称,因此net.minecraft.server将成为net.minecraft.server.v1_8_R1 换句话说,我只在运行时知道类名。我知道,我很难解释......

1 个答案:

答案 0 :(得分:1)

更新答案:

您已在评论中澄清,您只知道运行时的类型名称

字段(和构造函数参数)goat的类型设置为编译时。使用运行时信息创建Foo类的唯一方法就是这样做:在运行时生成它。没有用于声明占位符的机制,以后稍后将用字符串填充。

如果你绝对需要这样做,你可以调用的一些现有技术将是Tomcat(它即时编译JSP)和Vert.x(它即时生成类)。这将是非平凡的(当然,除非你只是向javac炮轰)。

原始答案

您可以使用generics执行此操作:

public class Foo<T> {
    private T goat;
    public Foo(T goat){
      this.goat=goat;
    }
}

用法:

Foo<Goat> f = new Foo<>(); // Or new Foo<Goat>() (earlier Java versions didn't support the <> form)

现在,f期望goatGoat

就像你在使用集合框架中的东西一样:

List<String> strings = new List<String>();
List<Date> dates = new List<Date>();
// ...