Mixin

Catatan

Halaman ini berlaku untuk SpongeCommon, SpongeForge, dan SpongeVanilla sebagai tiga repositori menggunakan Mixin untuk menghubungkan ke yang mendasari implementasi (Vanilla Minecraft server dan Menempa).

Mixin cara memodifikasi kode java pada saat runtime dengan menambahkan tambahan perilaku kelas. Mereka memungkinkan tanam dimaksudkan perilaku yang sudah ada Minecraft benda-benda. Mixin yang diperlukan untuk semua resmi Spons untuk implementasi fungsi.

Pengenalan dasar beberapa konsep inti yang mendasari fungsi mixin yang kami gunakan untuk menjalankan Sponge tersedia di`Mixin Wiki <https://github.com/SpongePowered/Mixin/wiki/>`_

dimulai dengan dasar-dasar yang mutlak. Jika anda seorang pengembang java yang berpengalaman, silahkan menuju kebagian 4, dimana mixin itu sendiri dibahas.

If you're looking to get started writing mixins, we also strongly recommend carefully examining all of the examples in the SpongeCommon repository which are extensively documented and cover many of the more complex scenarios. You should also consult the Javadoc of the Mixin repository itself, since almost everything is already documented.

Catatan

The Mixin project will be servicing a number of other projects in addition to Sponge itself. Therefore, Mixin has its own documentation together with the repository.

Mixins dan Inner Classes

Meskipun Anda dapat menggunakan lambdas, kelas anonim dan batin di dalam mixin, Anda tidak dapat menggunakan kelas anonim / dalam kelas anonim / dalam lainnya yang juga berada di dalam mixin, kecuali satu kelas dalam adalah `` statis``.

Ini berarti ungkapan seperti berikut ini akan menyebabkan mixin gagal dan membawa ke kematian dan kehancuran atas semua yang mencoba menggunakan sponge.

return new Collection<ItemStack>() {
    @Override
    public Iterator<ItemStack> iterator() {
        return new Iterator<ItemStack>() {
            // THIS WILL NOT WORK!

            @Override
            public boolean hasNext() {
                // Code skipped
            }

            @Override
            public ItemStack next() {
                // Code skipped
            }
        };
    }

    // Other methods skipped
};

Ini berlaku untuk semua kelas yang diberi catatan dengan `` @ Mixin``. Kelas yang tidak tersentuh oleh prosesor mixin bisa memanfaatkan fitur tersebut. Ada dua cara untuk mengatasi hal ini.

Salah satu pilihannya adalah menggunakan kelas utilitas terpisah, karena tidak seperti kelas mixer Anda, kelas utilitas akan tetap ada saat runtime, sementara kelas mixin Anda akan digabungkan ke dalam kelas target yang ditentukan. Kode berikut akan bekerja.

public class SampleCollection implements Collection<ItemStack> {

    private final TargetClass target;

    public SampleCollection(TargetClass target) {
        this.target = target;
    }

    @Override
    public Iterator<ItemStack> iterator() {
        return new Iterator<ItemStack>() {

            @Override
            public boolean hasNext() {
                // Code skipped
            }

            @Override
            public ItemStack next() {
                // Code skipped
            }
        };
    }

    // Other methods skipped
}

@Mixin(TargetClass.class)
public abstract class SomeMixin {
    public Collection<ItemStack> someFunction() {
        return new SampleCollection((TargetClass) (Object) this);
    }
}

Pilihan lainnya adalah menempatkan semua kelas batin bersarang secara langsung ke dalam mixin atau salah satu metodenya, yang bertentangan dengan yang ada di dalam yang lain. Sebagai contoh:

@Mixin(TargetClass.class)
public abstract class SomeMixin {

    private final class SampleIterator implements Iterator<ItemStack> {

        @Override
        public boolean hasNext() {
            // Code skipped
        }

        @Override
        public ItemStack next() {
            // Code skipped
        }
    }

    public Collection<ItemStack> someFunction() {
        return new Collection<ItemStack>() {
            @Override
            public Iterator<ItemStack> iterator() {
                return new SampleIterator();
            }

            // Other methods skipped
        };
    }
}