import java.io.Serializable; public class Foo implements Serializable { private String str; public Foo(String str) { this.str = str; } }
Foo是一个可以序列化的实体类
public class FooTest { private static final ReflectionFactory REFLECTION_FACTORY = ReflectionFactory.getReflectionFactory(); public static void main(String[] args) { Class<Foo> clazz = Foo.class; try { Foo foo = newSerializableInstance(clazz); } catch (InvocationTargetException e) { } } public static <T> T newSerializableInstance(Class<T> clazz) throws InvocationTargetException { Class<?> cl = clazz; while(Serializable.class.isAssignableFrom(cl)) { if ((cl = cl.getSuperclass()) == null) { return null; } } try { Constructor<?> cons = cl.getDeclaredConstructor((Class<?>[]) null); cons = REFLECTION_FACTORY.newConstructorForSerialization(clazz, cons); cons.setAccessible(true); return (T)cons.newInstance(); } catch (NoSuchMethodException e) { return null; } catch (InstantiationException e) { return null; } catch (IllegalAccessException e) { return null; } catch (IllegalArgumentException e) { return null; } } }
有兴趣的可以参看JDK
相关推荐
在某些情况下,如果子类的构造函数不是公开的,可以通过`ReflectionFactory`来创建实例。 这个过程的关键在于,攻击者需要找到合适的入口点,通过反序列化来触发恶意行为。在本例中,`BasicGetter`的构造函数接收三...
通过反射,我们可以将实例化过程延迟到运行时,只需知道类的全限定名(包括包名和类名)即可。这样,无需修改工厂类,就可以添加新的产品类型,降低了系统的耦合度。 具体步骤如下: 1. **获取Class对象**:首先,...
Java反射 如何使用该应用程序: 提供软件包和要从中创建新对象的类的名称。 可以使用get方法检索的所有字段都将显示在表格中。 如果该字段具有设置方法,则可以对其进行编辑。 所有方法均在下拉框中列出。
MethodAccessor 对象是由 ReflectionFactory 生成的,ReflectionFactory 对象在 Method 类中是静态的 final 的,由 native 方法实例化。 ReflectionFactory 生成 MethodAccessor 对象的过程是,如果 noInflation ...
在Executor的实现中,反射用于实例化StatementHandler、ParameterHandler和ResultSetHandler等关键组件。 6. **TypeHandler**:TypeHandler接口处理Java类型与数据库类型之间的转换,反射在这里用于读取和设置Java...
在acquireMethodAccessor方法中,会通过 ReflectionFactory 类的newMethodAccessor创建一个实现了MethodAccessor接口的对象。 在 Java 反射机制中,还有一个重要的数据结构ReflectionData,用来缓存从 JVM 中读取类...