BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #39739同步于 2015/4/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

能拦截java api调用吗

carrick16
2015/4/3镜像同步9 回复
想在不知道源代码的情况下,看看程序是否调用了某些java api。想到windows 的hook技术,对系统调用进行拦截,从而实现自己的功能。那么有办法对java的api调用进行拦截吗?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
MPSK机器人#1 · 2015/4/3
需要看什么api呢 【 在 carrick16 (Sixteen) 的大作中提到: 】 : 想在不知道源代码的情况下,看看程序是否调用了某些java api。想到windows 的hook技术,对系统调用进行拦截,从而实现自己的功能。那么有办法对java的api调用进... 发自〖iBYR-iOS客户端〗
carrick16机器人#2 · 2015/4/4
比如md5加密这种,或是否调用了jdbc等 【 在 MPSK 的大作中提到: : 需要看什么api呢 : 发自〖iBYR-iOS客户端〗 来自「北邮人论坛手机版」
nuanyangyang机器人#3 · 2015/4/4
以jdbc为例,如果那个被观察的类的JDBC工厂(比如javax.sql.DataSource)是你提供的,你可以给它提供你自定义的代理类,然后把调用转调给真的类。 java.lang.reflect.Proxy可以帮你动态地实现接口;CGLib可以帮你创建已有类的子类(而不只是接口)。
nuanyangyang机器人#4 · 2015/4/4
举个例子,如果主类Foo要计算md5,sha1什么的: // 用户 class Foo { private HashProvider hp; public Foo(HashProvider hp) { this.hp = hp; } public doJob() { String md5sum = hp.md5("Hello world!"); String sha1sum = hp.sha1("Goodbye World!"); } } // 抽象的接口 interface HashProvider { String md5(String msg); String sha1(String msg); } // 真的计算hash的类 class RealHashProvider implements HashProvider { @Override public String md5(String msg) { ... } @Override public String sha1(String msg) { ... } } // 假的代理类 class ProxyHashProvider implements HashProvider { private HashProvider real; public ProxyHashProvider(HashProvider real) { this.real = real } @Override public String md5(String msg) { System.out.format("User called md5 with argument '%s'\n", msg); return real.md5(msg); } @Override public String sha1(String msg) { System.out.format("User called sha1 with argument '%s'\n", msg); return real.sha1(msg); } } public class Main { public static void main(String args) { HashProvider real = new RealHashProvider(); HashProvider fake = new ProxyHashProvider(real); Foo foo1 = new Foo(real); foo1.doJob(); //这个不会被监视 Foo foo2 = new Foo(fake); foo2.doJob(); //这个会 } }
nuanyangyang机器人#5 · 2015/4/4
如果你要拦截的东西很多的话,你可以用class loader,让被监视的类装载的所有的类(或者某些你感兴趣的类)都变成你制造的proxy。 另外,看看AspectJ: https://eclipse.org/aspectj/ Aapect-oriented programming应该是做这样的事,我猜它应该是用类似的proxy手段实现的。
aiquestion机器人#6 · 2015/4/4
Jdk应该支持一种可以针对接口的拦截, Srping-AOP的实现会根据你选择是接口还是类, 接口就用Jdk的支持,类就用CGLIB生成代理类。 【 在 nuanyangyang 的大作中提到: 】 : 如果你要拦截的东西很多的话,你可以用class loader,让被监视的类装载的所有的类(或者某些你感兴趣的类)都变成你制造的proxy。 : 另外,看看AspectJ: https://eclipse.org/aspectj/ Aapect-oriented programming应该是做这样的事,我猜它应该是用类似的proxy手段实现的。
aiquestion机器人#7 · 2015/4/4
不知道jdk的 jvisualvm.exe能不能满足。 连接jvm以后去看sampler选cpu,似乎是可以看到调用的方法的。它应该是每隔一阵20ms(可以配置)去看看jvm里代码运行到的地方。 应该还有一种模式可以做类替换去测每个方法的运行时间。 【 在 carrick16 的大作中提到: 】 : 想在不知道源代码的情况下,看看程序是否调用了某些java api。想到windows 的hook技术,对系统调用进行拦截,从而实现自己的功能。那么有办法对java的api调用进行拦截吗?
UniKylin机器人#8 · 2015/4/4
AOP应该是你的解决方案
lovemaker机器人#9 · 2015/4/7
btrace