* address issue #1119 (serialization with protected/private constructor) * remove an unnecessary step in findNoArgConstructor() * use getDeclaredConstructor() in place of the for-loop * simplify by throwing the exception in findNoArgContructor()
This commit is contained in:
parent
909ea30216
commit
5eaf653de9
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2009-2012 jMonkeyEngine
|
* Copyright (c) 2009-2019 jMonkeyEngine
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -36,7 +36,9 @@ import com.jme3.effect.shapes.*;
|
|||||||
import com.jme3.material.MatParamTexture;
|
import com.jme3.material.MatParamTexture;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -161,16 +163,19 @@ public class SavableClassUtil {
|
|||||||
* @return the Savable instance of the class.
|
* @return the Savable instance of the class.
|
||||||
* @throws InstantiationException thrown if the class does not have an empty constructor.
|
* @throws InstantiationException thrown if the class does not have an empty constructor.
|
||||||
* @throws IllegalAccessException thrown if the class is not accessable.
|
* @throws IllegalAccessException thrown if the class is not accessable.
|
||||||
|
* @throws java.lang.reflect.InvocationTargetException
|
||||||
* @throws ClassNotFoundException thrown if the class name is not in the classpath.
|
* @throws ClassNotFoundException thrown if the class name is not in the classpath.
|
||||||
* @throws IOException when loading ctor parameters fails
|
|
||||||
*/
|
*/
|
||||||
public static Savable fromName(String className) throws InstantiationException,
|
public static Savable fromName(String className)
|
||||||
IllegalAccessException, ClassNotFoundException, IOException {
|
throws ClassNotFoundException, IllegalAccessException,
|
||||||
|
InstantiationException, InvocationTargetException {
|
||||||
className = remapClass(className);
|
className = remapClass(className);
|
||||||
|
|
||||||
|
Constructor noArgConstructor = findNoArgConstructor(className);
|
||||||
|
noArgConstructor.setAccessible(true);
|
||||||
try {
|
try {
|
||||||
return (Savable) Class.forName(className).newInstance();
|
return (Savable) noArgConstructor.newInstance();
|
||||||
} catch (InstantiationException e) {
|
} catch (InvocationTargetException | InstantiationException e) {
|
||||||
Logger.getLogger(SavableClassUtil.class.getName()).log(
|
Logger.getLogger(SavableClassUtil.class.getName()).log(
|
||||||
Level.SEVERE, "Could not access constructor of class ''{0}" + "''! \n"
|
Level.SEVERE, "Could not access constructor of class ''{0}" + "''! \n"
|
||||||
+ "Some types need to have the BinaryImporter set up in a special way. Please doublecheck the setup.", className);
|
+ "Some types need to have the BinaryImporter set up in a special way. Please doublecheck the setup.", className);
|
||||||
@ -184,6 +189,7 @@ public class SavableClassUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Savable fromName(String className, List<ClassLoader> loaders) throws InstantiationException,
|
public static Savable fromName(String className, List<ClassLoader> loaders) throws InstantiationException,
|
||||||
|
InvocationTargetException, NoSuchMethodException,
|
||||||
IllegalAccessException, ClassNotFoundException, IOException {
|
IllegalAccessException, ClassNotFoundException, IOException {
|
||||||
if (loaders == null) {
|
if (loaders == null) {
|
||||||
return fromName(className);
|
return fromName(className);
|
||||||
@ -208,4 +214,25 @@ public class SavableClassUtil {
|
|||||||
|
|
||||||
return fromName(className);
|
return fromName(className);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use reflection to gain access to the no-arg constructor of the named
|
||||||
|
* class.
|
||||||
|
*
|
||||||
|
* @return the pre-existing constructor (not null)
|
||||||
|
*/
|
||||||
|
private static Constructor findNoArgConstructor(String className)
|
||||||
|
throws ClassNotFoundException, InstantiationException {
|
||||||
|
Class clazz = Class.forName(className);
|
||||||
|
Constructor result;
|
||||||
|
try {
|
||||||
|
result = clazz.getDeclaredConstructor();
|
||||||
|
} catch (NoSuchMethodException e) {
|
||||||
|
throw new InstantiationException(
|
||||||
|
"Loading requires a no-arg constructor, but class "
|
||||||
|
+ className + " lacks one.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -345,16 +345,7 @@ public final class BinaryImporter implements JmeImporter {
|
|||||||
|
|
||||||
return out;
|
return out;
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (Exception e) {
|
||||||
logger.logp(Level.SEVERE, this.getClass().toString(), "readObject(int id)", "Exception", e);
|
|
||||||
return null;
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
logger.logp(Level.SEVERE, this.getClass().toString(), "readObject(int id)", "Exception", e);
|
|
||||||
return null;
|
|
||||||
} catch (InstantiationException e) {
|
|
||||||
logger.logp(Level.SEVERE, this.getClass().toString(), "readObject(int id)", "Exception", e);
|
|
||||||
return null;
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
logger.logp(Level.SEVERE, this.getClass().toString(), "readObject(int id)", "Exception", e);
|
logger.logp(Level.SEVERE, this.getClass().toString(), "readObject(int id)", "Exception", e);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2009-2012 jMonkeyEngine
|
* Copyright (c) 2009-2019 jMonkeyEngine
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -38,6 +38,7 @@ import com.jme3.export.SavableClassUtil;
|
|||||||
import com.jme3.util.BufferUtils;
|
import com.jme3.util.BufferUtils;
|
||||||
import com.jme3.util.IntMap;
|
import com.jme3.util.IntMap;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.FloatBuffer;
|
import java.nio.FloatBuffer;
|
||||||
import java.nio.IntBuffer;
|
import java.nio.IntBuffer;
|
||||||
@ -962,6 +963,7 @@ public class DOMInputCapsule implements InputCapsule {
|
|||||||
|
|
||||||
private Savable readSavableFromCurrentElem(Savable defVal) throws
|
private Savable readSavableFromCurrentElem(Savable defVal) throws
|
||||||
InstantiationException, ClassNotFoundException,
|
InstantiationException, ClassNotFoundException,
|
||||||
|
NoSuchMethodException, InvocationTargetException,
|
||||||
IOException, IllegalAccessException {
|
IOException, IllegalAccessException {
|
||||||
Savable ret = defVal;
|
Savable ret = defVal;
|
||||||
Savable tmp = null;
|
Savable tmp = null;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user