From 3ef08a42d7d880b96c2bcb4de0fc5344c820eac3 Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Wed, 13 May 2026 17:56:20 -0400 Subject: [PATCH] Class loading fixes --- .../ghidra/framework/options/GProperties.java | 21 ++++++++++++------- .../project/tool/GhidraToolTemplate.java | 6 ++++-- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/GProperties.java b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/GProperties.java index 0b2acfc995..8c8debe80a 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/GProperties.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/GProperties.java @@ -112,9 +112,7 @@ public class GProperties { */ public GProperties(Element root) { this(root.getName()); - Iterator iter = root.getChildren().iterator(); - while (iter.hasNext()) { - Element elem = (Element) iter.next(); + for (Element elem : root.getChildren()) { processElement(elem); } } @@ -298,7 +296,7 @@ public class GProperties { } } else if (tag.equals(GPROPERTIES_TAG)) { - Element element = (Element) elem.getChildren().get(0); + Element element = elem.getChildren().get(0); if (element != null) { map.put(name, new GProperties(element)); } @@ -435,10 +433,17 @@ public class GProperties { } 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) { return (Enum) m.invoke(null, new Object[] { value }); } @@ -821,7 +826,7 @@ public class GProperties { protected Element createElementFromElement(String internalKey, Element internalElement) { Element newElement = createElement("XML", internalKey); - Element internalElementClone = (Element) internalElement.clone(); + Element internalElementClone = internalElement.clone(); newElement.addContent(internalElementClone); return newElement; diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/project/tool/GhidraToolTemplate.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/project/tool/GhidraToolTemplate.java index 8c1b6395c6..b995f92be7 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/project/tool/GhidraToolTemplate.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/project/tool/GhidraToolTemplate.java @@ -130,11 +130,13 @@ public class GhidraToolTemplate implements ToolTemplate { public void restoreFromXml(Element root) { java.util.List list = root.getChildren("SUPPORTED_DATA_TYPE"); java.util.List> dtList = new ArrayList<>(); + ClassLoader loader = getClass().getClassLoader(); for (int i = 0; i < list.size(); ++i) { Element elem = (Element) list.get(i); String className = elem.getAttribute(CLASS_NAME_XML_NAME).getValue(); 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) { Msg.warn(this, "Tool supported content class not found: " + className); @@ -181,7 +183,7 @@ public class GhidraToolTemplate implements ToolTemplate { } root.addContent(iconElem); - root.addContent((Element) (toolElement.clone())); + root.addContent((toolElement.clone())); return root; }