mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-09-28 17:11:11 -09:00
Class loading fixes
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user