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

crawl3r

V2EX 第 326182 号会员,加入于 2018-07-02 11:22:57 +08:00
今日活跃度排名 18220
crawl3r 最近回复了
11 天前
回复了 tonymua 创建的主题 职场话题 双非菜鸡 Java offer 对比 求建议
第二个吧,搞区块链的除了做代币骗人,还没听说有能赢利的
12 天前
回复了 kidlfy 创建的主题 程序员 爬虫转行 seo 工程师可行吗
同爬虫,同在研究 seo。买了两本大头书,放着落灰了
28 天前
回复了 xiaoyazi 创建的主题 酷工作 招个熟逆向的长期兼职, 20k/m
做批量下单?
75 天前
回复了 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。
112 天前
回复了 mengyao123 创建的主题 酷工作 公司出钱让我们自己创业,是好是坏
王多鱼:谁还有梦想?
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   945 人在线   最高记录 5043   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.3 · 9ms · UTC 20:28 · PVG 04:28 · LAX 12:28 · JFK 15:28
♥ Do have faith in what you're doing.