返回信息流想在不知道源代码的情况下,看看程序是否调用了某些java api。想到windows 的hook技术,对系统调用进行拦截,从而实现自己的功能。那么有办法对java的api调用进行拦截吗?
这是一条镜像帖。来源:北邮人论坛 / java / #39739同步于 2015/4/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
能拦截java api调用吗
carrick16
2015/4/3镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
需要看什么api呢
【 在 carrick16 (Sixteen) 的大作中提到: 】
: 想在不知道源代码的情况下,看看程序是否调用了某些java api。想到windows 的hook技术,对系统调用进行拦截,从而实现自己的功能。那么有办法对java的api调用进...
发自〖iBYR-iOS客户端〗
比如md5加密这种,或是否调用了jdbc等
【 在 MPSK 的大作中提到:
: 需要看什么api呢
: 发自〖iBYR-iOS客户端〗
来自「北邮人论坛手机版」
以jdbc为例,如果那个被观察的类的JDBC工厂(比如javax.sql.DataSource)是你提供的,你可以给它提供你自定义的代理类,然后把调用转调给真的类。
java.lang.reflect.Proxy可以帮你动态地实现接口;CGLib可以帮你创建已有类的子类(而不只是接口)。
举个例子,如果主类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(); //这个会
}
}
如果你要拦截的东西很多的话,你可以用class loader,让被监视的类装载的所有的类(或者某些你感兴趣的类)都变成你制造的proxy。
另外,看看AspectJ: https://eclipse.org/aspectj/ Aapect-oriented programming应该是做这样的事,我猜它应该是用类似的proxy手段实现的。
Jdk应该支持一种可以针对接口的拦截, Srping-AOP的实现会根据你选择是接口还是类, 接口就用Jdk的支持,类就用CGLIB生成代理类。
【 在 nuanyangyang 的大作中提到: 】
: 如果你要拦截的东西很多的话,你可以用class loader,让被监视的类装载的所有的类(或者某些你感兴趣的类)都变成你制造的proxy。
: 另外,看看AspectJ: https://eclipse.org/aspectj/ Aapect-oriented programming应该是做这样的事,我猜它应该是用类似的proxy手段实现的。
不知道jdk的 jvisualvm.exe能不能满足。
连接jvm以后去看sampler选cpu,似乎是可以看到调用的方法的。它应该是每隔一阵20ms(可以配置)去看看jvm里代码运行到的地方。
应该还有一种模式可以做类替换去测每个方法的运行时间。
【 在 carrick16 的大作中提到: 】
: 想在不知道源代码的情况下,看看程序是否调用了某些java api。想到windows 的hook技术,对系统调用进行拦截,从而实现自己的功能。那么有办法对java的api调用进行拦截吗?