Skip to content

Commit

Permalink
Extend ReflectiveClassBuildItem with queryPublicMethods option
Browse files Browse the repository at this point in the history
Configures whether declared methods should be registered for reflection,
for query purposes only, i.e. {@link Class#getMethods()}. Setting this
enables getting all declared methods for the class but does not allow
invoking them reflectively.

Follow up to quarkusio#42035
  • Loading branch information
zakkak committed Sep 4, 2024
1 parent 12062b7 commit bc39178
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public final class ReflectiveClassBuildItem extends MultiBuildItem {
private final List<String> className;
private final boolean methods;
private final boolean queryMethods;
private final boolean queryPublicMethods;
private final boolean fields;
private final boolean classes;
private final boolean constructors;
Expand Down Expand Up @@ -46,7 +47,7 @@ public static Builder builder(String... classNames) {
private ReflectiveClassBuildItem(boolean constructors, boolean queryConstructors, boolean methods, boolean queryMethods,
boolean fields, boolean getClasses, boolean weak, boolean serialization, boolean unsafeAllocated, String reason,
Class<?>... classes) {
this(constructors, queryConstructors, methods, queryMethods, fields, getClasses, weak, serialization,
this(constructors, queryConstructors, methods, queryMethods, false, fields, getClasses, weak, serialization,
unsafeAllocated, reason, stream(classes).map(Class::getName).toArray(String[]::new));
}

Expand Down Expand Up @@ -118,12 +119,12 @@ public static ReflectiveClassBuildItem serializationClass(String... classNames)
ReflectiveClassBuildItem(boolean constructors, boolean queryConstructors, boolean methods, boolean queryMethods,
boolean fields, boolean weak, boolean serialization,
boolean unsafeAllocated, String... className) {
this(constructors, queryConstructors, methods, queryMethods, fields, false, weak, serialization, unsafeAllocated,
this(constructors, queryConstructors, methods, queryMethods, false, fields, false, weak, serialization, unsafeAllocated,
null, className);
}

ReflectiveClassBuildItem(boolean constructors, boolean queryConstructors, boolean methods, boolean queryMethods,
boolean fields, boolean classes, boolean weak, boolean serialization,
boolean queryPublicMethods, boolean fields, boolean classes, boolean weak, boolean serialization,
boolean unsafeAllocated, String reason, String... className) {
for (String i : className) {
if (i == null) {
Expand All @@ -140,6 +141,7 @@ public static ReflectiveClassBuildItem serializationClass(String... classNames)
} else {
this.queryMethods = queryMethods;
}
this.queryPublicMethods = queryPublicMethods;
this.fields = fields;
this.classes = classes;
this.constructors = constructors;
Expand Down Expand Up @@ -169,6 +171,10 @@ public boolean isQueryMethods() {
return queryMethods;
}

public boolean isQueryPublicMethods() {
return queryPublicMethods;
}

public boolean isFields() {
return fields;
}
Expand Down Expand Up @@ -216,6 +222,7 @@ public static class Builder {
private boolean queryConstructors;
private boolean methods;
private boolean queryMethods;
private boolean queryPublicMethods;
private boolean fields;
private boolean classes;
private boolean weak;
Expand Down Expand Up @@ -284,6 +291,20 @@ public Builder queryMethods() {
return queryMethods(true);
}

/**
* Configures whether declared methods should be registered for reflection, for query purposes only,
* i.e. {@link Class#getMethods()}. Setting this enables getting all declared methods for the class but
* does not allow invoking them reflectively.
*/
public Builder queryPublicMethods(boolean queryPublicMethods) {
this.queryPublicMethods = queryPublicMethods;
return this;
}

public Builder queryPublicMethods() {
return queryPublicMethods(true);
}

/**
* Configures whether fields should be registered for reflection.
* Setting this enables getting all declared fields for the class as well as accessing them reflectively.
Expand Down Expand Up @@ -358,8 +379,8 @@ public Builder unsafeAllocated() {
}

public ReflectiveClassBuildItem build() {
return new ReflectiveClassBuildItem(constructors, queryConstructors, methods, queryMethods, fields, classes, weak,
serialization, unsafeAllocated, reason, className);
return new ReflectiveClassBuildItem(constructors, queryConstructors, methods, queryMethods, queryPublicMethods,
fields, classes, weak, serialization, unsafeAllocated, reason, className);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,9 @@ void generateReflectConfig(BuildProducer<GeneratedResourceBuildItem> reflectConf
extractToJsonArray(info.queriedMethodSet, queriedMethodsArray);
}
}
if (info.queryPublicMethods) {
json.put("queryAllPublicMethods", true);
}
if (!methodsArray.isEmpty()) {
json.put("methods", methodsArray);
}
Expand Down Expand Up @@ -206,6 +209,9 @@ public void addReflectiveClass(Map<String, ReflectionInfo> reflectiveClasses, Se
if (classBuildItem.isQueryMethods()) {
existing.queryMethods = true;
}
if (classBuildItem.isQueryPublicMethods()) {
existing.queryPublicMethods = true;
}
if (classBuildItem.isFields()) {
existing.fields = true;
}
Expand Down Expand Up @@ -249,6 +255,7 @@ static final class ReflectionInfo {
boolean queryConstructors;
boolean methods;
boolean queryMethods;
boolean queryPublicMethods;
boolean fields;
boolean classes;
boolean serialization;
Expand All @@ -266,6 +273,7 @@ private ReflectionInfo() {
private ReflectionInfo(ReflectiveClassBuildItem classBuildItem, String typeReachable) {
this.methods = classBuildItem.isMethods();
this.queryMethods = classBuildItem.isQueryMethods();
this.queryPublicMethods = classBuildItem.isQueryPublicMethods();
this.fields = classBuildItem.isFields();
this.classes = classBuildItem.isClasses();
this.typeReachable = typeReachable;
Expand Down

0 comments on commit bc39178

Please sign in to comment.