Java 从现有超类字段生成子类

Java 从现有超类字段生成子类,java,superclass,Java,Superclass,我需要创建一个现有类的子类,我知道怎么做,但我需要能够基于现有的超类创建子类,而无需修改超类 例如: public class Foo { public Foo(int a) { _a = a; } private int _a; } public class Bar extends Foo { public Bar(int a, int b) { super(a); _b = b; }

我需要创建一个现有类的子类,我知道怎么做,但我需要能够基于现有的超类创建子类,而无需修改超类

例如:

public class Foo
{
    public Foo(int a)
    {
        _a = a;
    }
    private int _a;
}
public class Bar extends Foo
{
    public Bar(int a, int b)
    {
        super(a);
        _b = b;
    }
    public Bar(Foo foo, int b)
    {
        ???? //<----What do I do here?
        _b = b;
    }
    private int _b;
}
public static class Baz
{
    static void Main(String[] args)
    {
        Foo foo = new Foo(1);
        Bar bar = new Bar(foo, 2); //<---- How do I set this up?
    }
}
就打电话

super(foo.getA())//假设您有一个getA方法

你的问号在哪里

不能将新的Bar实例设为foo。(如果可以的话,我今天一定会学到一些东西)。

只要打电话就行了

super(foo.getA())//假设您有一个getA方法

你的问号在哪里


不能将新的Bar实例设为foo。(如果可以的话,我今天肯定学到了一些东西)。

添加一个
Foo
构造函数,该构造函数将
Foo
作为参数,并复制
\u a
,然后在指定的位置调用该构造函数

编辑:

公共类栏扩展了Foo
{
公共酒吧(a区、b区)
{
超级(a);
_b=b;
}
公共酒吧(富富,int b)
{

super(foo.getA(),b);添加一个
foo
构造函数,该构造函数将
foo
作为参数,并复制
\u a
,然后在指定的位置调用该构造函数

编辑:

公共类栏扩展了Foo
{
公共酒吧(a区、b区)
{
超级(a);
_b=b;
}
公共酒吧(富富,int b)
{

super(foo.getA(),b)如果Foo的私有变量a没有访问器方法,并且您无法更改Foo,那么除了一些方法之外,您无法执行您所描述的操作。您无法访问Foo。

如果Foo的私有变量a没有访问器方法,并且您无法更改Foo,那么除了一些方法之外,您无法执行您所描述的操作简单。您没有访问Foo的权限。_a。

遍历
Foo.class.getDeclaredFields()
,查找名为
\u a
的字段。在该字段上调用
字段。setAccessible(true)
,然后
Field.getValue()
将为您提供所需的值

我保留了这个更通用的代码

@SuppressWarnings("unchecked")
public static <T> T getFieldValue(Object target, String name) throws NoSuchFieldException, IllegalAccessException {
    Class<? extends Object> c = target.getClass();
    Field field = findField(c, name);
    if (field == null)
        throw new NoSuchFieldException(name);
    field.setAccessible(true);
    return (T) field.get(target);
}

public static Field findField(Class<? extends Object> clas, String name) {
    if (clas == null)
        return null;
    Field[] declaredFields = clas.getDeclaredFields();
    for (Field field : declaredFields) {
        if (field.getName().equals(name))
            return field;
    }
    return findField(clas.getSuperclass(), name);
}
@SuppressWarnings(“未选中”)
公共静态T getFieldValue(对象目标,字符串名称)抛出NoSuchFieldException、IllegalAccessException{

类遍历
Foo.Class.getDeclaredFields()
,查找一个名为
\u a
。调用
Field.setAccessible(true)
字段,然后
Field.getValue()
将为您提供所需的值

我保留了这个更通用的代码

@SuppressWarnings("unchecked")
public static <T> T getFieldValue(Object target, String name) throws NoSuchFieldException, IllegalAccessException {
    Class<? extends Object> c = target.getClass();
    Field field = findField(c, name);
    if (field == null)
        throw new NoSuchFieldException(name);
    field.setAccessible(true);
    return (T) field.get(target);
}

public static Field findField(Class<? extends Object> clas, String name) {
    if (clas == null)
        return null;
    Field[] declaredFields = clas.getDeclaredFields();
    for (Field field : declaredFields) {
        if (field.getName().equals(name))
            return field;
    }
    return findField(clas.getSuperclass(), name);
}
@SuppressWarnings(“未选中”)
公共静态T getFieldValue(对象目标,字符串名称)抛出NoSuchFieldException、IllegalAccessException{

类如果您将源文件复制到Foo,添加访问其字段等所需的方法,然后将副本放在原始文件之前的类路径中。

如果您将源文件复制到Foo,则将其复制并添加访问其字段等所需的方法,然后将副本放在原始文件之前的类路径中。

有一个它不是继承
Foo
,而是组合它并委托给它的方法

我注意到“真实的”
Foo
实现了一个接口。如果您可以围绕该接口而不是具体的
Foo
设计代码,
Bar
可以如下所示:

public class Bar implements IFoo {
  public Bar(IFoo foo, ...) {
    _foo = foo;
  }
  private IFoo _foo;
  // implement IFoo delegating all calls to _foo...
}

有一种方法可以解决这个问题,它不是继承
Foo
,而是组合它并委托给它的方法

我注意到“真实的”
Foo
实现了一个接口。如果您可以围绕该接口而不是具体的
Foo
设计代码,
Bar
可以如下所示:

public class Bar implements IFoo {
  public Bar(IFoo foo, ...) {
    _foo = foo;
  }
  private IFoo _foo;
  // implement IFoo delegating all calls to _foo...
}


请查看我的更新。Foo在一个我无法更改的库中。有其他方法吗?如果你不能更改
Foo
,并且如果Foo没有
getA()
方法,那么你就不走运了。
\u a
的值不可访问。如果
Foo
有一个方法
getA()
然后用它调用super(foo.getA())
。你能提供一个super(foo.getA())的完整示例吗使用中?我在理解上有点困难。@斯科特,用我答案中的行替换你的行。注意@jim answer是另一种方法;它叫做复制构造函数。这是使用@hvgotcode的解决方案。只有当
Foo
有一个返回
\u a
值的方法时才可用。请参阅我的pdate.Foo在一个我无法更改的库中。还有其他方法吗?如果你不能更改
Foo
,如果Foo没有
getA()
方法,那么你就不走运了。
\u a
的值是不可访问的。如果
Foo
有一个
getA()
方法,那么就用它来调用
super(Foo.getA())
。能否提供一个完整的超级示例(foo.getA())使用中?我在理解上有点困难。@斯科特,用我答案中的行替换你的行。注意@jim answer是另一种方法;它叫做复制构造函数。这是使用@hvgotcode的解决方案。只有当
Foo
有一个返回
\u a
值的方法时才可用。请参阅我的pdate.Foo位于我无法更改的库中。是否有其他方法?请查看我的更新。Foo位于我无法更改的库中。是否有其他方法?字段的可见性修饰符是什么?如何为ChunkProvider创建包装并扩展此包装?@Stefan问题是此类无法生成被世界拯救(我可以取代)。我的最终目标是让世界调用我的版本,而不是它的版本。有机会操纵世界吗?例如,使用子类或其他什么吗?@Stefan its just turtles一路向下。但是@Jordão发布了一个完全符合我需要的解决方案。字段的可见性修饰符是什么?如何创建