我想修改正在运行的app中的类。所以我用java代理来做这件事。我的java代码如下:
/**
*
* @param args
* @param inst
*/
public static void agentmain(String args, Instrumentation inst) {
try {
inst.addTransformer(new GameClassFileTransformer(), true);
parseFiles();
List<Class<?>> retransformClasses = new ArrayList<>();
for (JarClassInfo jarClassInfo : GameAgentMain.bugFiles.values()) {
retransformClasses.add(Class.forName(jarClassInfo.getClassName()));
}
Class<?>[] classes = new Class[retransformClasses.size()];
retransformClasses.toArray(classes);
inst.retransformClasses(classes);
} catch (Exception e) {
LogUtil.error(e);
}
}
JarClassInfo是一个关于我要重新加载的类的类。在JarClassInfo中有两个字段,第一个是className,第二个是字节码(java类型是byte []),classname是哪个类想要重新加载。但是类由
加载自定义classLoad
。当应用程序运行时:
retransformClasses.add(的Class.forName(jarClassInfo.getClassName()));
这是一个例外:
Exception in thread "Attach Listener" java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:382) at sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain(InstrumentationImpl.java:407) Caused by: java.lang.ClassFormatError: Incompatible magic value 2329931675 in class file com/jingqi/game/module/chat/command/SendChatMsgCMD at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:800) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) at java.net.URLClassLoader.access$1(URLClassLoader.java:409) at java.net.URLClassLoader$2.run(URLClassLoader.java:361) at java.net.URLClassLoader$2.run(URLClassLoader.java:1) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:190) at com.jingqi.game.agent.GameAgentMain.agentmain(GameAgentMain.java:60) ... 6 more
我的自定义类加载器(EncrypClassLoader)用于解码我的类。 因此,methd调用栈指示sun.misc.Launcher $ AppClassLoader加载SendChatMsgCMD。SendChatMsgCMD不是普通的类文件(因为我加密了这个类文件)。
那么,可以解决什么方法。
答案 0 :(得分:0)
您的自定义类加载器没有做它应该做的事情:解密类。
这就是为什么你得到java.lang.ClassFormatError
关于无效魔法值的原因。
编辑:您还需要意识到Class.forName()
将使用当前类的类加载器加载classname参数引用的类。