类加载器
1.作用:把磁盘中的class字节码文件加载到方法区内存中,加载后方法区就会有对应的Class模板
2.得到Class字节码对象的方法
2.1 类名.class
2.2 对象名.getClass()
2.3 Class.forName(“className”),其中className是包含包名的全类名,默认路径是项目编译输出的out根目录
3.通过Class字节码对象获得类加载器对象引用:clazz.getClassLoader();
3.1 通过类加载器对象加载其他资源:
//classLoader是通过任意自定义类获得的类加载器,com/test/resourceName是在项目编译输出的out根目录下的文件
InputStream in = classLoader.getResouceAsStream("com//test//resourceName");
3.2 java中不同的类加载器
1.系统类加载器AppClassLoader(自定义类的加载器):默认加载路径在项目编译后根目录中
2.拓展类加载器ExtensionLoader:存放在lib目录中
3.2.引导类加载器BootstrapLoader(如String类的加载器):用于加载java启动最核心的基本类
3.3 类加载器双亲委托机制
判断两个类class相同的条件:被同一类加载器加载并且类的全限定名相同
3.4自定义类加载器
继承ClassLoader,并且覆盖findClass方法,而不是loadClass,因为loadClass中封装了双亲委派机制
4.获取Class字节码对象中的内容
4.1 获取构造器
1.无参构造器:
Constructor constructor = clazz.getConstructor(null);
Object bean = constructor.newInstance(null);
或者简写为
Object bean = clazz.newInstance(null);
4.2 获取属性并设置值
Field field = clazz.getDeclaredField("myField");
field.setAccessible(true);
field.set(obj,"fieldValue");
4.3 获取方法并设置值
Method method = clazz.getMethod("methodName",Param1,class,Param2.class,...);
method.invoke(obj,param1,param2...);