现在我正在实现一个方法,它有一个Class类型的参数,如果给定的类对象需要一个实例来封闭它来实例化它,那么这个方法返回一个布尔值.
该方法目前的工作原理如下:
if (clazz.getEnclosingClass() == null) {
return false;
}
if (clazz.isAnonymousClass() || clazz.isMemberClass()) {
return !Modifier.isStatic(clazz.getModifiers());
}
if (clazz.getEnclosingConstructor() != null) {
return true;
}
final Method enclosingMethod = clazz.getEnclosingMethod();
if (enclosingMethod != null) {
return !Modifier.isStatic(enclosingMethod.getModifiers());
}
Run Code Online (Sandbox Code Playgroud)
解释为什么这样设计:
我需要步骤6来确定本地类是驻留在静态初始化块还是实例初始化块中,所以我已完成此函数的实现.
所以这里的反射API有点短.没有方法Class.getEnclosingInitializer()等,也没有一个类代表反射包中的初始化器.
初始化程序块不是类的成员吗?在java 1.8规范中,Member接口只有实现类Field,Executable(带有子类Constructor和Method),然后有大多数反射用户的成员名称.
我不确定规范背后的人是否忘记了这种情况,如果在静态方法/初始化程序(如匿名类)中声明,本地类实际应该是静态的.但在我看来,从这个角度来看,它缺乏最后的一致性.
那么有没有人知道如何确定本地类声明在哪种类型的初始化程序块中?
我并不是真的热衷于挖掘一个类似于它的封闭类的合成类型的字段,或者循环它的构造函数以获得类似于它的东西(旁注:参数对象Constructor.getParameters()始终返回false isImplicit()而isSynthetic()不管我尝试什么. ......那似乎是错的).所以如果我能避免这样的解决方案那么好.
是否存在java中定义的最大TCP端口号(65535)或Apache Commons等公共库的公共常量,我可以从我的代码中引用(而不是使用硬编码的整数)?
我的算法有两个输入:
最后,返回的结果将被放入一个 OutputStream 中,这个动作可能会发生多次,但至少一次。在这种情况下没有发生多线程。
我找到了两个解决方案:
深入研究这些方法背后的代码显示了每个底层算法的复杂设计。我不能说我明白如何在这两个选项之间做出选择。
哪种解决方案通常是更好的选择?