代码之家  ›  专栏  ›  技术社区  ›  MRalwasser

如何在java中创建合成字段?

  •  8
  • MRalwasser  · 技术社区  · 15 年前
    1. java中的合成字段只能在运行时创建吗? 如果没有:在编译时是否有一种标准兼容的方法(不更改类文件中的某些字节)

    2 回复  |  直到 15 年前
        1
  •  15
  •   Jon Skeet    15 年前

    public class Test
    {
        class Inner
        {
        }
    }
    

    这个 Test.Inner Test

    我们可以稍微扩展此代码以显示该字段:

    import java.lang.reflect.*;
    
    public class Test
    {
        public static void main(String[] args)
        {
            for (Field field : Inner.class.getDeclaredFields())
            {
                System.out.println(field.getName() + ": " + field.isSynthetic());
            }
        }
    
        class Inner
        {
        }
    }
    

    this$0: true
    
        2
  •  4
  •   Tassos Bassoukos    15 年前

    是的,这是可行的,它被称为加载时间编织。本质上,您需要定义自己的类加载器,它将根据类的大小写来决定是否修改即将加载的类文件;这意味着您需要检查正在加载的二进制类,可能需要对其进行修改,然后将其传递给JVM进行定义/解析。它有点麻烦、复杂,并且容易发生ClassCastExceptions(在两个不同的classloader中定义的同一个类将给出两个不兼容赋值的不同类)。

    注意,编织允许您做更多的事情:您可以添加新方法、接口、字段、修改现有类的代码等等。

        3
  •  1
  •   Happy    5 年前

    如何在Java中创建合成字段?

    synthetic 在某些特定情况下,字段是由Java编译器自动创建的。

    示例:

    java中的合成字段只能在运行时创建吗?如果没有:在编译时是否有一种标准兼容的方法(不更改类文件中的某些字节)

    这个 .class 文件已包含 ACC_SYNTHETIC 旗帜。尽管我们总是可以在运行时生成Java字段。

    更多信息