使用Java中的反射设置方法';s参数

使用Java中的反射设置方法';s参数,java,reflection,Java,Reflection,我正在努力实现以下目标: public class MyClass<E> { protected MyClass(Object[] variables) { //init } public MyClass(Comparator<? super E> comp, Object[] variables) { //init } public static <K extends Co

我正在努力实现以下目标:

public class MyClass<E>
{
    protected MyClass(Object[] variables)
    {
        //init
    }

    public MyClass(Comparator<? super E> comp, Object[] variables)
    {
        //init
    }

    public static <K extends Comparable<? super K>, T extends MyClass<K>> 
         T construct(T example, Object[] variables)
    {
        return new T(variables);
    }
}
公共类MyClass
{
受保护的MyClass(对象[]变量)
{
//初始化
}

publicmyclass(Comparator这可能有效,但我不推荐它。 注意,要使其工作,示例
和变量
的所有成员必须不为
null

public static <K extends Comparable<? super K>, T extends MyClass<K>> 
     T construct(T example, Object[] variables) throws 
                 NoSuchMethodException,
                 SecurityException,
                 InstantiationException,
                 IllegalAccessException,
                 IllegalArgumentException,
                 InvocationTargetException 
{
    Objects.requireNotNull(example);

    Class<?>[] argTypes = new Class<?>[variables.length];
    for ( int i = 0; i < variables.length; ++i)
    {
        // This will NPE if variables[i] is null
        argTypes[i] = variables[i].getClass();
    }

    // This will throw, if constructor is not defined
    Constructor<?> constructor = example.getClass().getConstructor(argTypes);

    return (T) constructor.newInstance(variables);
}
publicstatic[]argTypes=新类[variables.length];
对于(int i=0;i

通常,您正在做的事情可以通过创建一个工厂接口来实现,该接口创建特定类的实例。

这可能可行,但我不推荐这样做。 注意,要使其工作,示例
和变量
的所有成员必须不为
null

public static <K extends Comparable<? super K>, T extends MyClass<K>> 
     T construct(T example, Object[] variables) throws 
                 NoSuchMethodException,
                 SecurityException,
                 InstantiationException,
                 IllegalAccessException,
                 IllegalArgumentException,
                 InvocationTargetException 
{
    Objects.requireNotNull(example);

    Class<?>[] argTypes = new Class<?>[variables.length];
    for ( int i = 0; i < variables.length; ++i)
    {
        // This will NPE if variables[i] is null
        argTypes[i] = variables[i].getClass();
    }

    // This will throw, if constructor is not defined
    Constructor<?> constructor = example.getClass().getConstructor(argTypes);

    return (T) constructor.newInstance(variables);
}
publicstatic[]argTypes=新类[variables.length];
对于(int i=0;i

通常,您所做的可以通过创建一个工厂接口来实现,该接口创建特定类的实例。

我认为您不需要进行反思。您只需要简化所需内容,并使用java和泛型的强大功能来满足您的需要。下面是根据您的第三次编辑的示例:

class MyClass<E> {
    private Comparator<MyClass<E>> comparator;

    public MyClass(List<Object> params, Comparator<MyClass<E>> comparator) {
        //init
        this.comparator = comparator;
    }

}
class  MyClassExtension extends MyClass<Integer> {

    public MyClassExtension(List<Object> params, Comparator<MyClass<java.lang.Integer>> comparator) {
        super(params, comparator);
    }
}
class  MyClassExtension2<E> extends MyClass<E> {

    public MyClassExtension2(List<Object> params, Comparator<MyClass<E>> comparator) {
        super(params, comparator);
    }
}
class-MyClass{
专用比较器;
公共MyClass(列表参数、比较器比较器){
//初始化
这个比较器=比较器;
}
}
类MyClassExtension扩展了MyClass{
公共MyClassExtension(列表参数、比较器比较器){
超级(参数、比较器);
}
}
类MyClassExtension2扩展了MyClass{
公共MyClassExtension2(列表参数、比较器比较器){
超级(参数、比较器);
}
}

我认为您不需要进行反思。您只需要简化所需内容,并使用java和泛型的强大功能来满足您的需要。下面是您第三次编辑的示例:

class MyClass<E> {
    private Comparator<MyClass<E>> comparator;

    public MyClass(List<Object> params, Comparator<MyClass<E>> comparator) {
        //init
        this.comparator = comparator;
    }

}
class  MyClassExtension extends MyClass<Integer> {

    public MyClassExtension(List<Object> params, Comparator<MyClass<java.lang.Integer>> comparator) {
        super(params, comparator);
    }
}
class  MyClassExtension2<E> extends MyClass<E> {

    public MyClassExtension2(List<Object> params, Comparator<MyClass<E>> comparator) {
        super(params, comparator);
    }
}
class-MyClass{
专用比较器;
公共MyClass(列表参数、比较器比较器){
//初始化
这个比较器=比较器;
}
}
类MyClassExtension扩展了MyClass{
公共MyClassExtension(列表参数、比较器比较器){
超级(参数、比较器);
}
}
类MyClassExtension2扩展了MyClass{
公共MyClassExtension2(列表参数、比较器比较器){
超级(参数、比较器);
}
}

我想我自己可能已经意识到了一个潜在的解决方案,尽管我希望得到关于其可行性的反馈

public class MyClass<E>
{
    public MyClass(Comparable<? super E> example, E example2, Object[] variables) 
      throws IllegalArgumentException
    {
        if(!example.getClass().equals(example2.getClass())
        {
             throw new IllegalArgumentException();
        }
        //init
    }

    public MyClass(Comparator<? super E> comp, Object[] variables)
    {
        //init
    }
}
公共类MyClass
{

公共MyClass(Compariable我想我自己可能已经意识到了一个潜在的解决方案,尽管我希望得到关于其可行性的反馈

public class MyClass<E>
{
    public MyClass(Comparable<? super E> example, E example2, Object[] variables) 
      throws IllegalArgumentException
    {
        if(!example.getClass().equals(example2.getClass())
        {
             throw new IllegalArgumentException();
        }
        //init
    }

    public MyClass(Comparator<? super E> comp, Object[] variables)
    {
        //init
    }
}
公共类MyClass
{

公共MyClass(Comparable@BenjaminUrquhart作为解决方案的一部分,它可能很有用,但我不知道如何使用它来设置构造方法所需的参数。这就是为什么我要问这个问题。如果你知道这样做的方法,那么请详细说明。哦,你不能动态地设置构造函数可以采用的参数。你可以选择最接近的参数o是
varargs
受保护的MyClass(对象…变量)
)嗨,Timothy,我想你需要的目标比涉及反射和不必要的复杂性要简单得多。你能告诉我在可比参数和对象参数后面是什么,这样我就可以为你找到更简单的解决方案吗?@BorislavMarkov这是我创建一个类时的一个通用模板,其中包含它形成的数据类型应该以某种方式进行排序,例如有序数据结构。如果该数据类型与同类其他数据类型具有可比性,则接受该数据类型。如果不具有可比性,则需要传入用于比较该类型对象的比较器。由于这是一个模板,因此对象参数只是特定代码的占位符,其中列出了类需要进行构造。我不确定这是否回答了您的问题。如果不是,那么您能澄清一下您的意思吗?@BenjaminUrquhart这可能是解决方案的一部分,但我知道没有办法使用它来设置构造方法所需的参数。这就是为什么我要问这个问题。如果您知道这样做的方法,然后请详细说明。哦,您不能动态设置构造函数可以接受的参数。您可以做的最接近的操作是
varargs
protectedmyclass(Object…variables)
)嗨,Timothy,我想你需要的目标比涉及反射和不必要的复杂性要简单得多。你能告诉我在可比参数和对象参数后面是什么,这样我就可以为你找到更简单的解决方案吗?@BorislavMarkov这是我创建一个类时的一个通用模板,其中包含它形成的数据类型应该以某种方式进行排序,例如有序数据结构。如果该数据类型与同类其他数据类型具有可比性,则接受该数据类型。如果不具有可比性,则需要传入用于比较该类型对象的比较器。由于这是一个模板,因此对象参数只是特定代码的占位符,其中列出了类需要构造。我不确定这是否回答了你的问题。如果不是,那么你能澄清你的意思吗?好的。谢谢。如果你建议使用Factory接口,那么你能解释一下我将如何使用它,或者告诉我在哪里使用它吗