Quarkus notes (2)

About quarkus-app/quarkus/transformed-bytecode.jar file Java reflection is not well supported on native executable code generation. But some libraries such as JPA are highly dependent on Java reflection. So some classes will be decompiled, added codes which were originally done by Java reflection, and then compiled and packed into transformed-bytecode.jar. Following is the original code of a JPA entity. @Entity @Table(name = "users") @UserDefinition public class User { @Id @Username private String username; @Column(nullable = false) @Password private String password; @Column private Integer enabled; @ManyToMany @JoinTable(name = "user_authority", joinColumns = @JoinColumn(name = "username"), inverseJoinColumns = @JoinColumn(name = "authority_id")) private Set authorities; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getEnabled() { return enabled; } public void setEnabled(Integer enabled) { this.enabled = enabled; } public Set getAuthorities() { return authorities; } public void setAuthorities(Set authorities) { this.authorities = authorities; } @Roles public String authorities() { return StringUtils.join(authorities, ","); } } Code is transformed as following. @Entity @Table( name = "users" ) @UserDefinition @EnhancementInfo( version = "6.6.4.Final" ) public class User implements ManagedEntity, PersistentAttributeInterceptable, ExtendedSelfDirtinessTracker { @Id @Username String username; @Column( nullable = false ) @Password String password; @Column Integer enabled; @ManyToMany @JoinTable( name = "user_authority", joinColumns = {@JoinColumn( name = "username" )}, inverseJoinColumns = {@JoinColumn( name = "authority_id" )} ) Set authorities; @Transient private transient EntityEntry $$_hibernate_entityEntryHolder; @Transient private transient ManagedEntity $$_hibernate_previousManagedEntity; @Transient private transient ManagedEntity $$_hibernate_nextManagedEntity; @Transient private transient boolean $$_hibernate_useTracker; @Transient private transient PersistentAttributeInterceptor $$_hibernate_attributeInterceptor; @Transient private transient DirtyTracker $$_hibernate_tracker; @Transient private transient CollectionTracker $$_hibernate_collectionTracker; public User() { } public String getUsername() { return this.$$_hibernate_read_username(); } public void setUsername(String username) { this.$$_hibernate_write_username(username); } public String getPassword() { return this.$$_hibernate_read_password(); } public void setPassword(String password) { this.$$_hibernate_write_password(password); } public Integer getEnabled() { return this.$$_hibernate_read_enabled(); } public void setEnabled(Integer enabled) { this.$$_hibernate_write_enabled(enabled); } public Set getAuthorities() { return this.$$_hibernate_read_authorities(); } public void setAuthorities(Set authorities) { this.$$_hibernate_write_authorities(authorities); } @Roles public String authorities() { return StringUtils.join(this.$$_hibernate_read_authorities(), ","); } public Object $$_hibernate_getEntityInstance() { return this; } public EntityEntry $$_hibernate_getEntityEntry() { return this.$$_hibernate_entityEntryHolder; } public void $$_hibernate_setEntityEntry(EntityEntry var1) { this.$$_hibernate_entityEntryHolder = var1; } public ManagedEntity $$_hibernate_getPreviousManagedEntity() { return this.$$_hibernate_previousManagedEntity; } public void $$_hibernate_setPreviousManagedEntity(ManagedEntity var1) { this.$$_hibernate_previousManagedEntity = var1; } public ManagedEntity $$_hibernate_getNextManagedEntity() { return this.$$_hibernate_nextManagedEntity; } public void $$_hibernate_setNextManagedEntity(ManagedEntity var1) { this.$$_hibernate_nextManagedEntity = var1; } public boolean $$_hibernate_useTracker() { return this.$$_hibernate_useTracker; } public void $$_hibernate_setUseTracker(boolean var1) { this.$$_hibernate_useTracker = var1; } public PersistentAttributeInterceptor $$_hibernate_getInterceptor() { return this.$$_hibernate_attributeInterceptor; } public void $$_hibernate_setInterceptor(PersistentAttributeIntercept

Jan 19, 2025 - 16:11
Quarkus notes (2)

About quarkus-app/quarkus/transformed-bytecode.jar file

Java reflection is not well supported on native executable code generation. But some libraries such as JPA are highly dependent on Java reflection. So some classes will be decompiled, added codes which were originally done by Java reflection, and then compiled and packed into transformed-bytecode.jar.

Following is the original code of a JPA entity.

@Entity
@Table(name = "users")
@UserDefinition
public class User {

    @Id
    @Username
    private String username;
    @Column(nullable = false)
    @Password
    private String password;
    @Column
    private Integer enabled;
    @ManyToMany
    @JoinTable(name = "user_authority", joinColumns = @JoinColumn(name = "username"), inverseJoinColumns = @JoinColumn(name = "authority_id"))
    private Set<Authority> authorities;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getEnabled() {
        return enabled;
    }

    public void setEnabled(Integer enabled) {
        this.enabled = enabled;
    }

    public Set<Authority> getAuthorities() {
        return authorities;
    }

    public void setAuthorities(Set<Authority> authorities) {
        this.authorities = authorities;
    }

    @Roles
    public String authorities() {
        return StringUtils.join(authorities, ",");
    }

}

Code is transformed as following.

@Entity
@Table(
    name = "users"
)
@UserDefinition
@EnhancementInfo(
    version = "6.6.4.Final"
)
public class User implements ManagedEntity, PersistentAttributeInterceptable, ExtendedSelfDirtinessTracker {
    @Id
    @Username
    String username;
    @Column(
        nullable = false
    )
    @Password
    String password;
    @Column
    Integer enabled;
    @ManyToMany
    @JoinTable(
        name = "user_authority",
        joinColumns = {@JoinColumn(
    name = "username"
)},
        inverseJoinColumns = {@JoinColumn(
    name = "authority_id"
)}
    )
    Set<Authority> authorities;
    @Transient
    private transient EntityEntry $$_hibernate_entityEntryHolder;
    @Transient
    private transient ManagedEntity $$_hibernate_previousManagedEntity;
    @Transient
    private transient ManagedEntity $$_hibernate_nextManagedEntity;
    @Transient
    private transient boolean $$_hibernate_useTracker;
    @Transient
    private transient PersistentAttributeInterceptor $$_hibernate_attributeInterceptor;
    @Transient
    private transient DirtyTracker $$_hibernate_tracker;
    @Transient
    private transient CollectionTracker $$_hibernate_collectionTracker;

    public User() {
    }

    public String getUsername() {
        return this.$$_hibernate_read_username();
    }

    public void setUsername(String username) {
        this.$$_hibernate_write_username(username);
    }

    public String getPassword() {
        return this.$$_hibernate_read_password();
    }

    public void setPassword(String password) {
        this.$$_hibernate_write_password(password);
    }

    public Integer getEnabled() {
        return this.$$_hibernate_read_enabled();
    }

    public void setEnabled(Integer enabled) {
        this.$$_hibernate_write_enabled(enabled);
    }

    public Set<Authority> getAuthorities() {
        return this.$$_hibernate_read_authorities();
    }

    public void setAuthorities(Set<Authority> authorities) {
        this.$$_hibernate_write_authorities(authorities);
    }

    @Roles
    public String authorities() {
        return StringUtils.join(this.$$_hibernate_read_authorities(), ",");
    }

    public Object $$_hibernate_getEntityInstance() {
        return this;
    }

    public EntityEntry $$_hibernate_getEntityEntry() {
        return this.$$_hibernate_entityEntryHolder;
    }

    public void $$_hibernate_setEntityEntry(EntityEntry var1) {
        this.$$_hibernate_entityEntryHolder = var1;
    }

    public ManagedEntity $$_hibernate_getPreviousManagedEntity() {
        return this.$$_hibernate_previousManagedEntity;
    }

    public void $$_hibernate_setPreviousManagedEntity(ManagedEntity var1) {
        this.$$_hibernate_previousManagedEntity = var1;
    }

    public ManagedEntity $$_hibernate_getNextManagedEntity() {
        return this.$$_hibernate_nextManagedEntity;
    }

    public void $$_hibernate_setNextManagedEntity(ManagedEntity var1) {
        this.$$_hibernate_nextManagedEntity = var1;
    }

    public boolean $$_hibernate_useTracker() {
        return this.$$_hibernate_useTracker;
    }

    public void $$_hibernate_setUseTracker(boolean var1) {
        this.$$_hibernate_useTracker = var1;
    }

    public PersistentAttributeInterceptor $$_hibernate_getInterceptor() {
        return this.$$_hibernate_attributeInterceptor;
    }

    public void $$_hibernate_setInterceptor(PersistentAttributeInterceptor var1) {
        this.$$_hibernate_attributeInterceptor = var1;
    }

    public void $$_hibernate_trackChange(String var1) {
        if (this.$$_hibernate_tracker == null) {
            this.$$_hibernate_tracker = new SimpleFieldTracker();
        }

        this.$$_hibernate_tracker.add(var1);
    }

    public String[] $$_hibernate_getDirtyAttributes() {
        Object var1 = null;
        String[] var2;
        if (this.$$_hibernate_collectionTracker == null) {
            var2 = this.$$_hibernate_tracker == null ? ArrayHelper.EMPTY_STRING_ARRAY : this.$$_hibernate_tracker.get();
        } else {
            if (this.$$_hibernate_tracker == null) {
                this.$$_hibernate_tracker = new SimpleFieldTracker();
            }

            this.$$_hibernate_getCollectionFieldDirtyNames(this.$$_hibernate_tracker);
            var2 = this.$$_hibernate_tracker.get();
        }

        return var2;
    }

    public boolean $$_hibernate_hasDirtyAttributes() {
        boolean var1 = false;
        var1 = this.$$_hibernate_tracker != null && !this.$$_hibernate_tracker.isEmpty() || this.$$_hibernate_areCollectionFieldsDirty();
        return var1;
    }

    public void $$_hibernate_clearDirtyAttributes() {
        if (this.$$_hibernate_tracker != null) {
            this.$$_hibernate_tracker.clear();
        }

        this.$$_hibernate_clearDirtyCollectionNames();
    }

    public void $$_hibernate_suspendDirtyTracking(boolean var1) {
        if (this.$$_hibernate_tracker == null) {
            this.$$_hibernate_tracker = new SimpleFieldTracker();
        }

        this.$$_hibernate_tracker.suspend(var1);
    }

    public CollectionTracker $$_hibernate_getCollectionTracker() {
        return this.$$_hibernate_collectionTracker;
    }

    public boolean $$_hibernate_areCollectionFieldsDirty() {
        boolean var1 = false;
        if (!var1 && this.$$_hibernate_collectionTracker != null) {
            int var2 = this.$$_hibernate_collectionTracker.getSize("authorities");
            if (this.authorities == null && var2 != -1) {
                var1 = true;
            } else if (this.authorities != null && (!(this.authorities instanceof PersistentCollection) || ((PersistentCollection)this.authorities).wasInitialized()) && var2 != this.authorities.size()) {
                var1 = true;
            }
        }

        return var1;
    }

    public void $$_hibernate_getCollectionFieldDirtyNames(DirtyTracker var1) {
        if (this.$$_hibernate_collectionTracker != null) {
            int var2 = this.$$_hibernate_collectionTracker.getSize("authorities");
            if (this.authorities == null && var2 != -1) {
                var1.add("authorities");
            } else if (this.authorities != null && (!(this.authorities instanceof PersistentCollection) || ((PersistentCollection)this.authorities).wasInitialized()) && var2 != this.authorities.size()) {
                var1.add("authorities");
            }
        }

    }

    public void $$_hibernate_clearDirtyCollectionNames() {
        if (this.$$_hibernate_collectionTracker == null) {
            this.$$_hibernate_collectionTracker = new SimpleCollectionTracker();
        }

        this.$$_hibernate_removeDirtyFields((LazyAttributeLoadingInterceptor)null);
    }

    public void $$_hibernate_removeDirtyFields(LazyAttributeLoadingInterceptor var1) {
        if (this.$$_hibernate_attributeInterceptor instanceof LazyAttributeLoadingInterceptor) {
            var1 = (LazyAttributeLoadingInterceptor)this.$$_hibernate_attributeInterceptor;
        }

        if (var1 == null || var1.isAttributeLoaded("authorities")) {
            if (this.authorities != null && (!(this.authorities instanceof PersistentCollection) || ((PersistentCollection)this.authorities).wasInitialized())) {
                this.$$_hibernate_collectionTracker.add("authorities", this.authorities.size());
            } else {
                this.$$_hibernate_collectionTracker.add("authorities", -1);
            }
        }

    }

    public String $$_hibernate_read_username() {
        if (this.$$_hibernate_getInterceptor() != null) {
            this.username = (String)this.$$_hibernate_getInterceptor().readObject(this, "username", this.username);
        }

        return this.username;
    }

    public void $$_hibernate_write_username(String var1) {
        if (this.$$_hibernate_getInterceptor() != null) {
            this.username = (String)this.$$_hibernate_getInterceptor().writeObject(this, "username", this.username, var1);
        } else {
            this.username = var1;
        }
    }

    public String $$_hibernate_read_password() {
        if (this.$$_hibernate_getInterceptor() != null) {
            this.password = (String)this.$$_hibernate_getInterceptor().readObject(this, "password", this.password);
        }

        return this.password;
    }

    public void $$_hibernate_write_password(String var1) {
        if (!InlineDirtyCheckerEqualsHelper.areEquals(this, "password", var1, this.password)) {
            this.$$_hibernate_trackChange("password");
        }

        if (this.$$_hibernate_getInterceptor() != null) {
            this.password = (String)this.$$_hibernate_getInterceptor().writeObject(this, "password", this.password, var1);
        } else {
            this.password = var1;
        }
    }

    public Integer $$_hibernate_read_enabled() {
        if (this.$$_hibernate_getInterceptor() != null) {
            this.enabled = (Integer)this.$$_hibernate_getInterceptor().readObject(this, "enabled", this.enabled);
        }

        return this.enabled;
    }

    public void $$_hibernate_write_enabled(Integer var1) {
        if (!InlineDirtyCheckerEqualsHelper.areEquals(this, "enabled", var1, this.enabled)) {
            this.$$_hibernate_trackChange("enabled");
        }

        if (this.$$_hibernate_getInterceptor() != null) {
            this.enabled = (Integer)this.$$_hibernate_getInterceptor().writeObject(this, "enabled", this.enabled, var1);
        } else {
            this.enabled = var1;
        }
    }

    public Set $$_hibernate_read_authorities() {
        if (this.$$_hibernate_getInterceptor() != null) {
            this.authorities = (Set)this.$$_hibernate_getInterceptor().readObject(this, "authorities", this.authorities);
        }

        return this.authorities;
    }

    public void $$_hibernate_write_authorities(Set var1) {
        if (this.$$_hibernate_getInterceptor() != null) {
            this.authorities = (Set)this.$$_hibernate_getInterceptor().writeObject(this, "authorities", this.authorities, var1);
        } else {
            this.authorities = var1;
        }
    }
}

About XXX$$accessor class

Some classes and their methods are defined in package-private, so they are inaccessible in many case. For example class io.quarkus.liquibase.deployment.LiquibaseProcessor.

class LiquibaseProcessor {

    @BuildStep
    FeatureBuildItem feature() {
        return new FeatureBuildItem(Feature.LIQUIBASE);
    }

    // ...
}

So a synthetic XXX$$accessor class is generated so that public method is provided for accessing instances of these classes.

@io.quarkus.Generated("Quarkus annotation processor")
public final class LiquibaseProcessor$$accessor {
    private LiquibaseProcessor$$accessor() {}
    public static Object construct() {
        return new LiquibaseProcessor();
    }
}