Class loading fixes

This commit is contained in:
dragonmacher
2026-05-13 17:56:20 -04:00
parent 56d5167e93
commit 3ef08a42d7
2 changed files with 17 additions and 10 deletions

View File

@@ -112,9 +112,7 @@ public class GProperties {
*/ */
public GProperties(Element root) { public GProperties(Element root) {
this(root.getName()); this(root.getName());
Iterator<?> iter = root.getChildren().iterator(); for (Element elem : root.getChildren()) {
while (iter.hasNext()) {
Element elem = (Element) iter.next();
processElement(elem); processElement(elem);
} }
} }
@@ -298,7 +296,7 @@ public class GProperties {
} }
} }
else if (tag.equals(GPROPERTIES_TAG)) { else if (tag.equals(GPROPERTIES_TAG)) {
Element element = (Element) elem.getChildren().get(0); Element element = elem.getChildren().get(0);
if (element != null) { if (element != null) {
map.put(name, new GProperties(element)); map.put(name, new GProperties(element));
} }
@@ -435,10 +433,17 @@ public class GProperties {
} }
Enum<?> getEnumValue(String enumClassName, String value) { Enum<?> getEnumValue(String enumClassName, String value) {
try {
Class<?> enumClass = Class.forName(enumClassName).asSubclass(Enum.class);
Method m = enumClass.getMethod("valueOf", new Class[] { String.class }); ClassLoader loader = getClass().getClassLoader();
try {
Class<?> clazz = Class.forName(enumClassName, false, loader);
if (!Enum.class.isAssignableFrom(clazz)) {
Msg.error(this, "Class is not an Enum: " + clazz);
return null;
}
// Note: calling valueOf() will trigger class initialization
Method m = clazz.getMethod("valueOf", new Class[] { String.class });
if (m != null) { if (m != null) {
return (Enum<?>) m.invoke(null, new Object[] { value }); return (Enum<?>) m.invoke(null, new Object[] { value });
} }
@@ -821,7 +826,7 @@ public class GProperties {
protected Element createElementFromElement(String internalKey, Element internalElement) { protected Element createElementFromElement(String internalKey, Element internalElement) {
Element newElement = createElement("XML", internalKey); Element newElement = createElement("XML", internalKey);
Element internalElementClone = (Element) internalElement.clone(); Element internalElementClone = internalElement.clone();
newElement.addContent(internalElementClone); newElement.addContent(internalElementClone);
return newElement; return newElement;

View File

@@ -130,11 +130,13 @@ public class GhidraToolTemplate implements ToolTemplate {
public void restoreFromXml(Element root) { public void restoreFromXml(Element root) {
java.util.List<?> list = root.getChildren("SUPPORTED_DATA_TYPE"); java.util.List<?> list = root.getChildren("SUPPORTED_DATA_TYPE");
java.util.List<Class<?>> dtList = new ArrayList<>(); java.util.List<Class<?>> dtList = new ArrayList<>();
ClassLoader loader = getClass().getClassLoader();
for (int i = 0; i < list.size(); ++i) { for (int i = 0; i < list.size(); ++i) {
Element elem = (Element) list.get(i); Element elem = (Element) list.get(i);
String className = elem.getAttribute(CLASS_NAME_XML_NAME).getValue(); String className = elem.getAttribute(CLASS_NAME_XML_NAME).getValue();
try { try {
dtList.add(Class.forName(className)); // no need to perform static initialization; clients only check isAssignableFrom()
dtList.add(Class.forName(className, false, loader));
} }
catch (ClassNotFoundException e) { catch (ClassNotFoundException e) {
Msg.warn(this, "Tool supported content class not found: " + className); Msg.warn(this, "Tool supported content class not found: " + className);
@@ -181,7 +183,7 @@ public class GhidraToolTemplate implements ToolTemplate {
} }
root.addContent(iconElem); root.addContent(iconElem);
root.addContent((Element) (toolElement.clone())); root.addContent((toolElement.clone()));
return root; return root;
} }