VM中不同ClassLoader权限的限制
来源:互联网 发布:oracle数据库设计工具 编辑:程序博客网 时间:2024/05/22 00:37
package com.wy.classloader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.lang.reflect.Field;import java.lang.reflect.Method;import sun.reflect.Reflection;public class DiffClassLoderSamePackage {public static class Bean {String defaultFiled ;public String publicFiled ;protected String protectedFiled ;void defaultMethod(Bean b) {}protected void protectedMethod(Bean b) {}public void publicMethod(Bean b) {}public void publicMethod() {}}public static class ClassLader extends ClassLoader {/** * 实现优先于父类加载类文件 */@Overridepublic Class<?> loadClass(String name) throws ClassNotFoundException {Class<?> c = findLoadedClass(name);if (c != null) {return c;}byte[] b = getClassBytes(name);if (b != null) {return defineClass(name, b, 0, b.length);} else {return super.loadClass(name);}}/** * 读取class文件的内容 * * @param className * qualified类名 * @return 文件的字节内容, 异常或者找不到文件时返回null */private byte[] getClassBytes(String className) {String path = System.getProperty("java.class.path") + File.separator+ className.replace('.', File.separatorChar) + ".class";FileInputStream fis = null;try {fis = new FileInputStream(path);byte[] bs = new byte[fis.available()];fis.read(bs);return bs;} catch (Exception e) {return null;} finally {try {if (fis != null) {fis.close();}} catch (IOException e) {// ignore}}}}public static void main(String[] args) throws Exception {// 由app ClassLoader加载Bean appB = new Bean();// 由自定义 ClassLoader加载ClassLader cust = new ClassLader();Class<?> custC = cust.loadClass("com.wy.classloader.DiffClassLoderSamePackage$Bean");//Object custB = (Bean)custC.newInstance(); //1. 不同类加载器加载的类,无法强制类型转换Object custB = custC.newInstance();//default//Method custDefaultM = custC.getDeclaredMethod("defaultMethod", Bean.class); //2. 参数类型判定为不一致Method custDefaultM = custC.getDeclaredMethod("defaultMethod", custC);//protected//Method custProtectedM = custC.getDeclaredMethod("protectedMethod", Bean.class); //2. 参数类型判定为不一致Method custProtectedM = custC.getDeclaredMethod("protectedMethod", custC);//public//Method custPublicM = custC.getDeclaredMethod("publicMethod", Bean.class); //2. 参数类型判定为不一致Method custPublicM = custC.getDeclaredMethod("publicMethod", custC);Method custPublicMethodNoArg= custC.getDeclaredMethod("publicMethod");//非public成员,当调用者的ClassLoader与加载Method所在Class的ClassLoader不一致时,无法访问 . Reflection.ensureMemberAccess()//custDefaultM.invoke(custB, custB); //3. can not access a member of class with modifiers ""//custProtectedM.invoke(custB, custB); //3. can not access a member of class with modifiers "protected"//public方法通过调用者ClassLoader检测,但对于接收者要进行ClassLoader类型检测. //custPublicM.invoke(appB, custB);// 4. object is not an instance of declaring class//custPublicM.invoke(appB, appB);// 4. object is not an instance of declaring class//custPublicMethodNoArg.invoke(appB);// 4. object is not an instance of declaring class//custPublicM.invoke(custB, appB);// 5. argument type mismatchcustPublicMethodNoArg.invoke(custB); //okcustPublicM.invoke(custB, custB);// ok//非public成员,当调用者的ClassLoader与加载Method所在Class的ClassLoader不一致时,无法访问 .Reflection.ensureMemberAccess()custC.getDeclaredField("defaultFiled").get(custB); //6. can not access a member of class with modifiers ""//custC.getDeclaredField("protectedFiled").get(custB); //6. can not access a member of class with modifiers "protected"//custC.getDeclaredField("publicFiled").get(appB); //7. Can not set java.lang.String field defaultFiled to BeancustC.getDeclaredField("publicFiled").get(custB); //ok}}
3-6Exception in thread "main" java.lang.IllegalAccessException: at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)at java.lang.reflect.Method.invoke(Method.java:588)at com.wy.classloader.DiffClassLoderSamePackage.main4.Exception in thread "main" java.lang.IllegalArgumentException: object is not an instance of declaring classat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)at com.wy.classloader.DiffClassLoderSamePackage.main5.Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatchat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)at com.wy.classloader.DiffClassLoderSamePackage.main(DiffClassLoderSamePackage.java:121)7.Exception in thread "main" java.lang.IllegalArgumentException: Can not set java.lang.String field publicFiled to Beanat sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150)at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:18)at java.lang.reflect.Field.get(Field.java:358)at com.wy.classloader.DiffClassLoderSamePackage.main
0 0
- VM中不同ClassLoader权限的限制
- 系统权限的限制
- 不同DBMS中限制结果sql的写法
- 不同ClassLoader使用同一object的例子
- Class.forName和ClassLoader.loadClass的不同
- 修改 Linux VM 中单个用户最大进程数的限制
- NC63开发中遇到的访问权限限制问题
- Linux中限制用户访问权限的3种方法
- 不同浏览器Cookie的限制
- Android中ClassLoader和java中ClassLoader有什么关系和不同
- 有没有人知道如何从VM中取得宿主机的权限
- java中不同访问权限
- 怎样设置svn中不同文件夹的权限
- java 中ClassLoader的原理
- ssh 的权限 端口 限制
- V8系统中不同权限的用户有不同的图标功能
- jsp中判断的问题(例如不同权限有不同操作,页面相同)
- 不同classloader装载的类不能互相访问?
- FP-Tree算法的实现
- android 通过图片的uri来获取图片的绝对路径
- 上海名表维修中心上海亨时达钟表服务中心
- Linux/Ubuntu学习笔记(六)--JDK安装及一个java例程
- 百度地图,高德地图在打包时都要混淆
- VM中不同ClassLoader权限的限制
- enum可以没有枚举名
- 对文章的整理
- scrapy 之一
- 【DP_背包专辑】【10.14最新更新】
- How to use cref links redirect to external content ?
- 如何从搭建有GIT服务的服务器上下载代码?
- scrapy 之二
- CC_SAFE_RELEASE_NULL 没有初始化的坑