所以Java NIO架构师没有创建一个ByteBuffer接口,而是一个ByteBuffer类,它不是最终类,但它没有包 - 公共构造函数,因此它不能在其包之外进行子类化.阿福.:P
我有一个程序使用内存映射的文件字节缓冲区(通过FileChannel.map()获得)在一堆地方,我正在尝试追踪一个讨厌的错误,有问题的文件是打开的,因为有at至少一个ByteBuffer没有发布到垃圾收集.
我想创造一个InstrumentedByteBuffer看起来像一个字节的缓冲区类,但装饰定期ByteBuffer(或它的子类,例如MappedByteBuffer),并保持它的存在(包括创建新的缓冲区的赛道duplicate()和slice()) -这样我可以保持我的代码不变,使用ByteBuffer,我只需要修饰原始的字节缓冲区.
有没有办法做到这一点(通过反射或代理或其他)来绕过私人构造函数?我不需要将它发送到最终产品,我只需要暂时使用它来解决这个bug.
我正在玩Java的Reflection.我有一个Base带构造函数的抽象类.
abstract class Base {
public Base( String foo ) {
// do some magic
}
}
Run Code Online (Sandbox Code Playgroud)
我还有一些课程在扩展Base.它们没有太多逻辑.我想用Base构造函数实例化它们,而不必在这些派生类中编写一些代理构造函数.当然,我想用Reflection实例化那些派生类.说:
Class cls = SomeDerivedClass.class;
Constructor constr;
constr = cls.getConstructor( new Class[] { String.class } ); // will return null
Class clsBase = Base.class;
constr = clsBase.getConstructor( new Class[] { String.class } ); // ok
Base obj = (Base) constr.newInstance( new Object[] { "foo" } ); // will throw InstantiationException because it belongs to an abstract class …Run Code Online (Sandbox Code Playgroud) 举个例子:
public class Foo {
private Foo() {}
}
public class Bar extends Foo {
private Bar() {}
static public doSomething() {
}
}
Run Code Online (Sandbox Code Playgroud)
那是一个编译错误.一个类至少需要隐式调用它的超类的默认构造函数,在这种情况下,它在Foo中是不可见的.
我可以从Bar调用Object的构造函数吗?