Dưới đây là một ví dụ từ một số mã Tôi đã làm việc về nơi hướng dẫn nop nơi đặt vào mã byte (như xem bởi Bytecode Visualizer cho Eclipse)
Mã gốc
public abstract class Wrapper<T extends Wrapper<T,E>,E>
implements Supplier<Optional<E>>, Consumer<E>
{
/** The wrapped object. */
protected Optional<E> inner;
/*
* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
/**
* A basic equals method that will compare the wrapped object to
* whatever you throw at it, whether it is wrapped or not.
*/
@Override
public boolean equals(final Object that)
{
return this==that
||LambdaUtils.castAndMap(that,Wrapper.class,afterCast
-> inner.equals(afterCast.inner))
.orElseGet(()
-> LambdaUtils.castAndMap(that,Optional.class,afterCast
-> inner.equals(afterCast))
.orElseGet(()
-> Optional.ofNullable(that).map(thatobj
-> that.equals(inner.get()))
.orElseGet(()
-> false)));
}
}
Mã byte đã dịch cho phương thức equals (Object)
public boolean equals(java.lang.Object arg0) {
/* L27 */
0 aload_0; /* this */
1 aload_1; /* that */
2 if_acmpeq 36;
/* L28 */
5 aload_1; /* that */
6 ldc 1;
8 aload_0; /* this */
9 invokedynamic 29; /* java.util.function.Function apply(ext.cat.wcutils.collections.Wrapper arg0) */
12 nop;
13 nop;
14 invokestatic 30; /* java.util.Optional ext.cat.wcutils.util.LambdaUtils.castAndMap(java.lang.Object arg0, java.lang.Class arg1, java.util.function.Function arg2) */
/* L30 */
17 aload_0; /* this */
18 aload_1; /* that */
19 invokedynamic 39; /* java.util.function.Supplier get(ext.cat.wcutils.collections.Wrapper arg0, java.lang.Object arg1) */
22 nop;
23 nop;
24 invokevirtual 40; /* java.lang.Object orElseGet(java.util.function.Supplier arg0) */
27 checkcast 46; /* java.lang.Boolean */
30 invokevirtual 48; /* boolean booleanValue() */
/* L37 */
33 ifne 5;
/* L27 */
36 iconst_0;
37 ireturn;
38 iconst_1;
39 ireturn;
}
Tôi không chắc chắn tại sao chúng được chèn vào. Tôi chỉ hy vọng họ không ảnh hưởng xấu đến hiệu suất.
Thông thường nó được sử dụng trong mã gỡ lỗi để cho phép các điểm ngắt trên thứ không dịch sang bytecode, như '{'. – vcsjones
Bạn có nghĩa là điều này sẽ xuất hiện trong bytecode khi một tệp Java được biên dịch với 'javac -g'? – jbranchaud
Tôi không tin rằng 'javac' sẽ làm điều đó. Nhưng các trình biên dịch và trình gỡ rối khác có thể sử dụng chức năng đó. – vcsjones