Как вы можете расширить Java, чтобы ввести передачу по ссылке?

Java передается по значению. Как вы могли бы изменить язык, чтобы ввести передачу по ссылке (или какое-то эквивалентное поведение)?

Взять например что-то вроде

public static void main(String[] args) {
    String variable = "'previous String reference'";
    passByReference(ref variable);
    System.out.println(variable); // I want this to print 'new String reference'
}

public static void passByReference(ref String someString) {
    someString = "'new String reference'";
}

который (безref) компилируется в следующеебайткодом

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #2                  // String 'previous String reference'
       2: astore_1
       3: aload_1
       4: invokestatic  #3                  // Method passByReference:(Ljava/lang/String;)V
       7: return

  public static void passByReference(java.lang.String);
    Code:
       0: ldc           #4                  // String 'new String reference'
       2: astore_0
       3: return

Код на3: загружает ссылку в стек из переменнойvariable.

Одна возможность, которую я рассматриваю, состоит в том, чтобы компилятор определил метод, передаваемый по ссылке, возможно сrefи измените метод так, чтобы он принимал объект Holder, который хранит ту же ссылку, что и наша переменная. Когда метод завершает работу и, возможно, изменяет эту ссылку в держателе, переменная на стороне вызывающего абонента заменяется значением ссылки на держателя.

Это должно компилироваться в эквивалент этого

public static void main(String[] args) {
    String variable = "'previous String reference'";
    Holder holder = Holder.referenceOf(variable);
    passByReference2(holder);
    variable = (String) holder.getReference(); // I don't think this cast is necessary in bytecode
    System.out.println(variable);
}

public static void passByReference(Holder someString) {
    someString.setReference("'new String reference'");
}

гдеHolder может быть что-то вроде

public class Holder {
    Object reference;
    private Holder (Object reference) {
        this.reference = reference;
    }
    public Object getReference() {
        return this.reference;
    }
    public void setReference(Object reference) {
        this.reference = reference;
    }
    public static Holder referenceOf(Object reference) {
        return new Holder(reference);
    }
}

Где это может потерпеть неудачу или как вы можете улучшить это?

Ответы на вопрос(2)

Ваш ответ на вопрос