使用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接口,那么你能解释一下我将如何使用它,或者告诉我在哪里使用它吗