Java Hook简洁实用教程

本文详细介绍了如何通过动态代理和Hook技术修改接口方法参数和实例属性,展示了在People类中实现IAction接口并使用DynamicProxyHandler进行代理,以及hook接口和属性的具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般来说,hook的应用场景就是修改或拦截某些系统类的方法及替换属性

直接上代码!

有一个接口IAction

public interface IAction {
    void eat(String food);
}

People类中有一个"name"属性,并实现了接口IAction

public class People implements IAction {
    private String name = "小明";

    @Override
    public void eat(String food) {
        System.out.println(name + "吃" + food);
    }
}

动态代理类,实现InvocationHandler接口,构造函数传入被代理的对象

public class DynamicProxyHandler implements InvocationHandler {
    private Object proxied;// 被代理的对象

    public DynamicProxyHandler(Object proxied) {
        this.proxied = proxied;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 执行代理对象原来的方法之前,加入任何自己想要的动作
        System.out.println(" ==== 代理方法接收的参数是:"+args[0]);
        args[0] = "苹果";
        System.out.println(" ==== 改为:"+args[0]);
        // 执行代理对象原来的方法
        return method.invoke(proxied,args);
    }
}
public class Test {
    public static void main(String[] args) {
        System.out.println("-----正常操作-----");
        normal();

        System.out.println("\n-----hook代理-----");
        hookInterface();

        System.out.println("\n-----hook属性-----");
        hookAttr();
    }

    /**
     * 正常操作
     */
    public static void normal() {
        People people = new People();
        people.eat("梨子");
    }

    /**
     * hook方法
     */

    public static void hookInterface() {
        People people = new People();

        IAction iAction = (IAction) Proxy.newProxyInstance(
                IAction.class.getClassLoader(),
                new Class[]{IAction.class},
                new DynamicProxyHandler(people));

        iAction.eat("梨子"); // 虽然传递的是"梨子",但hook过程被修改了
    }

    /**
     * hook属性
     */
    public static void hookAttr(){
        try {
            System.out.println(" ==== hook属性,狸猫换太子,小明变小强");

            People people = new People();

            Field field = People.class.getDeclaredField("name");
            field.setAccessible(true);
            field.set(people, "小强");

            people.eat("梨子");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行Test输出:

-----正常操作-----
小明吃梨子

-----hook代理-----
 ==== 代理方法接收的参数是:梨子
 ==== 改为:苹果
小明吃苹果

-----hook属性-----
 ==== hook属性,狸猫换太子,小明变小强
小强吃梨子
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大炮走火

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值