java注入鼠标侦听器无法使用ASM
所以在这里,我试图将我的鼠标侦听器类注入到另一个类中,这样我就可以用它做一些事情。下面是我的课程
这是我的第一个类:我想将自己的侦听器注入其中的类
package testing;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.applet.Applet;
public class MouseListenerTest extends Applet implements java.awt.event.MouseListener, MouseMotionListener, FocusListener
{
private String field;
private int num; //Just some fields why not
private int test;
/*
* OTher methods and fields and stuff just generated for testing
*
*/
@Override
public void mouseDragged(MouseEvent e)
{
//doStuff
}
@Override
public void mouseMoved(MouseEvent e)
{
//doStuff
}
@Override
public void mouseClicked(MouseEvent e)
{
//doStuff
}
@Override
public void mouseEntered(MouseEvent e)
{
//doStuff
}
@Override
public void mouseExited(MouseEvent e)
{
//doStuff
}
@Override
public void mousePressed(MouseEvent e)
{
//doStuff
}
@Override
public void mouseReleased(MouseEvent e)
{
//doStuff
}
@Override
public void focusGained(FocusEvent arg0)
{
// TODO Auto-generated method stub
}
@Override
public void focusLost(FocusEvent arg0)
{
// TODO Auto-generated method stub
}
}
这是我创建的类,它将用来覆盖MouseStener的类
package testing;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
public abstract class MouseListener extends FocusListener implements java.awt.event.MouseListener, MouseMotionListener
{
private int x;
private int y;
public abstract void _mouseClicked(MouseEvent paramMouseEvent);
public abstract void _mouseDragged(MouseEvent paramMouseEvent);
public abstract void _mouseEntered(MouseEvent paramMouseEvent);
public abstract void _mouseExited(MouseEvent paramMouseEvent);
public abstract void _mouseMoved(MouseEvent paramMouseEvent);
public abstract void _mousePressed(MouseEvent paramMouseEvent);
public abstract void _mouseReleased(MouseEvent paramMouseEvent);
public abstract void _mouseWheelMoved(MouseWheelEvent paramMouseEvent);
@Override
public void mouseDragged(MouseEvent e)
{
_mouseDragged(e);
e.consume();
}
@Override
public void mouseMoved(MouseEvent e)
{
_mouseMoved(e);
e.consume();
}
@Override
public void mouseClicked(MouseEvent e)
{
_mouseClicked(e);
e.consume();
}
@Override
public void mouseEntered(MouseEvent e)
{
_mouseEntered(e);
e.consume();
}
@Override
public void mouseExited(MouseEvent e)
{
_mouseExited(e);
e.consume();
}
@Override
public void mousePressed(MouseEvent e)
{
x++;
y++;
_mousePressed(e);
e.consume();
}
@Override
public void mouseReleased(MouseEvent e)
{
_mouseReleased(e);
e.consume();
}
}
这是我用来更改字段和方法的类。(注意,我只是为它包含了一个框架。实际上我并不是这样做的。(使用这个类)我加载这个类,然后.accept(cn, ...)
在其他地方将它传递给这个类)
package testing;
import java.util.List;
import java.util.ListIterator;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
public class Injector
{
public static ClassNode getClassNode()
{return new ClassNode(Opcodes.ASM5);}
public static ClassNode transformClass(ClassNode cn)
{
List<MethodNode> a = cn.methods;
for(MethodNode mn : a)
{
if(mn.name.startsWith("mouse"))
{
ClassNode superClass = getClassNode(); //loaded the classNode just there for emphasis
if(superClass!=null && !superClass.superName.equals("testing/MouseListener"))
{
superClass.superName="testing/MouseListener";
System.out.println("Changed superclass of : "+superClass.name+" = "+superClass.superName);
List<MethodNode> c = superClass.methods;
for (MethodNode node : c)
{
if (node.name.equals("<init>"))
{
ListIterator<AbstractInsnNode> ili = node.instructions.iterator();
while (ili.hasNext())
{
AbstractInsnNode ain = ili.next();
if (ain.getOpcode() == Opcodes.INVOKESPECIAL)
{
MethodInsnNode min = (MethodInsnNode) ain;
if (min.owner.equals("java/lang/Object"))
{
System.out.println("Changed initialization owner.");
min.owner = "testing/MouseListener";
break;
}
}
}
break;
}
}
}
mn.name="_"+mn.name;
System.out.println("Hooked method : "+mn.name);
}
}
return cn;
}
}
现在我遇到了一个实际的问题:
- 注入器工作得不太正常,它在我的鼠标侦听器中将方法名称更改为抽象名称,但问题来了
- 它不会改变顶部的进口,因此它知道它是我的。这导致我正在注入的程序抛出一系列抽象错误,因为它没有覆盖鼠标侦听器的所有方法,因为我更改了它们李>
我的问题是,是否有人知道或能为我指出如何改变进口的正确方向?所以它看起来像是“testing.MouseListener”等等
共 (0) 个答案