有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我最近在尝试使用反射使我的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;
}

老实说,我甚至不知道这是否可能,但这将大大有助于加快我的发展

编辑:

我的情况比我之前介绍的要复杂一些。这就是我不能实际使用泛型的原因。我上面演示的“Goat”类型实际上是一个我不知道的包中的类,所以我只知道类名。因此,我必须利用课堂。forName方法以及一个小算法,该算法检测当前的bukkit版本,并将其附加到我已经知道的包名,即so net。我的世界。服务器将变成网络。我的世界。服务器v1_8_R1 换句话说,我只知道运行时的类名。我知道,我不擅长解释


共 (1) 个答案

  1. # 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期望goat成为Goat

    这就像使用集合框架中的某些内容一样:

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