小编dam*_*ewl的帖子

Java:如何确定初始化程序块中定义的本地类是否需要封闭实例进行实例化?

现在我正在实现一个方法,它有一个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)

解释为什么这样设计:

  1. 它首先检查它是否是顶级类,如果是,算法可以安全地返回false
  2. 如果该类是匿名的或成员类,如果它不是静态的,则它需要一个关闭实例(如果在静态构造函数/ method/initializer-block中声明了anynmous类,则它是自动静态的)
  3. 现在可以假定该类是本地类(忽略数组和基元),因此它在构造函数,方法或初始化程序中定义.但是,与匿名类不同,本地类从不被视为静态类,但如果在非静态块中定义本地类,则仍需要封闭实例.
  4. 构造函数永远不会是静态的,因此在这种情况下返回true
  5. 如果它在方法中定义,则如果方法不是静态的,则返回true

我需要步骤6来确定本地类是驻留在静态初始化块还是实例初始化块中,所以我已完成此函数的实现.

所以这里的反射API有点短.没有方法Class.getEnclosingInitializer()等,也没有一个类代表反射包中的初始化器.

初始化程序块不是类的成员吗?在java 1.8规范中,Member接口只有实现类Field,Executable(带有子类Constructor和Method),然后有大多数反射用户的成员名称.

我不确定规范背后的人是否忘记了这种情况,如果在静态方法/初始化程序(如匿名类)中声明,本地类实际应该是静态的.但在我看来,从这个角度来看,它缺乏最后的一致性.

那么有没有人知道如何确定本地类声明在哪种类型的初始化程序块中?

我并不是真的热衷于挖掘一个类似于它的封闭类的合成类型的字段,或者循环它的构造函数以获得类似于它的东西(旁注:参数对象Constructor.getParameters()始终返回false isImplicit()isSynthetic()不管我尝试什么. ......那似乎是错的).所以如果我能避免这样的解决方案那么好.

java reflection static class

11
推荐指数
1
解决办法
272
查看次数

java中的最大tcp端口号常量

是否存在java中定义的最大TCP端口号(65535)或Apache Commons等公共库的公共常量,我可以从我的代码中引用(而不是使用硬编码的整数)?

java tcp

10
推荐指数
1
解决办法
2989
查看次数

Java:String.getBytes(Charset) Vs。用于 OutputStream 的 Charset.encode(String)

我的算法有两个输入:

  • 1 utf8 将被编码的字符串对象
  • 1 Charset 对象,它指示我需要将字符串编码成什么

最后,返回的结果将被放入一个 OutputStream 中,这个动作可能会发生多次,但至少一次。在这种情况下没有发生多线程。

我找到了两个解决方案:

  1. 在给定的 String 上调用 getBytes(Charset) 并提供给定的 Charset。这将返回一个字节[]
  2. 在给定的字符集上调用 encode(String) 并提供给定的字符串。这将返回一个 ByteBuffer。

深入研究这些方法背后的代码显示了每个底层算法的复杂设计。我不能说我明白如何在这两个选项之间做出选择。

  1. 调用任一方法是否存在显着的性能差异?
  2. 将结果放入 OutputStream 是否有显着的性能差异?
  3. 足迹是否有显着差异?

哪种解决方案通常是更好的选择?

java string encoding bytebuffer character-encoding

3
推荐指数
1
解决办法
709
查看次数