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发布了一个完全符合我需要的解决方案。字段的可见性修饰符是什么?如何创建