首页   注册   登录
 crawl3r 最近的时间轴更新

crawl3r

V2EX 第 326182 号会员,加入于 2018-07-02 11:22:57 +08:00
crawl3r 最近回复了
3 天前
回复了 tonymua 创建的主题 职场话题 双非菜鸡 Java offer 对比 求建议
第二个吧,搞区块链的除了做代币骗人,还没听说有能赢利的
5 天前
回复了 kidlfy 创建的主题 程序员 爬虫转行 seo 工程师可行吗
同爬虫,同在研究 seo。买了两本大头书,放着落灰了
21 天前
回复了 xiaoyazi 创建的主题 酷工作 招个熟逆向的长期兼职, 20k/m
做批量下单?
68 天前
回复了 Tezos 创建的主题 优惠信息 移动手机号积分兑换话费
河北移动兑换成功,感谢 lz
对了,之前写过一篇文章《跨 classloader 类型转换》( http://www.wisedream.net/2017/01/17/programming/type-cast-across-classloader/) 你可以参考下
看下源码
`
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
{
Objects.requireNonNull(h);

final Class<?>[] intfs = interfaces.clone();
// Android-changed: sm is always null
// final SecurityManager sm = System.getSecurityManager();
// if (sm != null) {
// checkProxyAccess(Reflection.getCallerClass(), loader, intfs);
// }

/*
* Look up or generate the designated proxy class.
*/
Class<?> cl = getProxyClass0(loader, intfs);

/*
* Invoke its constructor with the designated invocation handler.
*/
try {
// Android-changed: sm is always null
// if (sm != null) {
// checkNewProxyPermission(Reflection.getCallerClass(), cl);
// }

final Constructor<?> cons = cl.getConstructor(constructorParams);
final InvocationHandler ih = h;
if (!Modifier.isPublic(cl.getModifiers())) {
// Android-changed: Removed AccessController.doPrivileged
cons.setAccessible(true);
}
return cons.newInstance(new Object[]{h});
} catch (IllegalAccessException|InstantiationException e) {
throw new InternalError(e.toString(), e);
} catch (InvocationTargetException e) {
Throwable t = e.getCause();
if (t instanceof RuntimeException) {
throw (RuntimeException) t;
} else {
throw new InternalError(t.toString(), t);
}
} catch (NoSuchMethodException e) {
throw new InternalError(e.toString(), e);
}
}

`
注意这行代码*Class<?> cl = getProxyClass0(loader, intfs);*
通过 loader 加载或生成某个 proxy 类,也就是说 jvm 创建的 proxy 类挂到了这个 classloader 上。对于你这个例子没法说。我给你讲个实际的例子。
对于安卓应用是通过 DexClassLoader 加载的,而 xposed 模块是通过 PathClassloader 加载的,它们是同级的类加载器。如果想在 xposed 模块中调用应用里的某个方法,如` void download(String url, ICallback)`.
我们可以用反射创建 ICallback 的动态代理。在调用这个方法的时候它是运行在应用内的,也就是说对于安卓应用来说它是不知道有个 PathClassloader 的,所以创建的 ICallback 动态代理必须能够通过它自己的类加载器加载到,否则就是 ClassNotFound。
105 天前
回复了 mengyao123 创建的主题 酷工作 公司出钱让我们自己创业,是好是坏
王多鱼:谁还有梦想?
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3201 人在线   最高记录 5043   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.3 · 11ms · UTC 10:23 · PVG 18:23 · LAX 02:23 · JFK 05:23
♥ Do have faith in what you're doing.