ClassLoader和Reflect
2024-10-13 02:59:30
什么情况下使用ClassLoader来加载类?其实这个问题应该问,什么时候使用import来加载类,不能使用import的,就只能使用ClassLoader了。
使用import的条件:
1.必须是存在本地的,当程序员需要这个类的时候,内部类装载器会自动装载该类,对程序员来说是透明的。
2.编译的时候必须在现场,否则编译器会因为找不到引用文件而不能正常的编译。
ClassLoader分为3种,用一个简单的例子来说明:
public static void printClassLoader(){
ClassLoader loader = Thread.currentThread().getContextClassLoader();
System.out.println("loader = " + loader.getClass());
System.out.println("loader parent = " + loader.getParent().getClass());
System.out.println("loader parent parent = " + loader.getParent().getParent());
}
loader = class sun.misc.Launcher$AppClassLoader
loader parent = class sun.misc.Launcher$ExtClassLoader
loader parent parent = null
分别是: AppClassLoader,ExtClassLoader,BootClassLoader。从上面的代码可以看到继承关系。
Class反射则是对象描述类语义结构,在java.reflect包中,主要是3个反射类:Constructor,Method,Field。
我们有一个Car类
public class Car {
private String name; public Car(){ } public void showName(){
System.out.println("name = " + name);
}
}
里面比较坑的是,有name属性,但是没有提供修改的办法,我们可以用反射来修改。
public static void getColor(){
ClassLoader loader = Thread.currentThread().getContextClassLoader();
try{
Class clazz = loader.loadClass("Car");
Object car = (Object)clazz.newInstance(); Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
name.set(car,"carry");//在这里修改属性 Method method = clazz.getMethod("showName");
method.invoke(car,(Object[])null); }catch(Exception e){
System.out.println(e.toString());
}
}
这是平时写代码的时候,比较有用的技巧。
最新文章
- C#把 DataTable转换为Model实体
- Markdown编辑器入门
- 【原创】Android selector选择器无效或无法正常显示的一点研究
- jquery插件链接
- Collections的应用
- 转:通过代码理解Asp.net4中的几种ClientIDMode设置.
- 一道关于java 类初始化 成员初始化的笔试题的解析
- 69个spring面试题及答案
- Delphi TStringList的用法
- 手动同步chrome浏览器
- SQL Server 2008数据库的一些基本概念 区、页、行
- C语言之linux内核--BCD码转二进制与二进制转BCD码(笔试经典)
- WBS 与 甘特图
- Redis的过期策略和内存淘汰机制
- 输出列表为字符串,并在最后一个值前加上and 4.10.1
- 【Spring】SpringMVC非注解配置的两种方式
- 【吉比特】G-bits2018校园春季招聘技术类岗位笔试经验
- 新型智能芯片nxp----嗯质朴
- igraph Tutorial
- 【前端自动化构建 grunt、gulp、webpack】
热门文章
- algorithm@ Divide two integers without using multiplication, division and mod operator. (Bit Operation)
- Java中HashMap和TreeMap的区别深入理解
- Java网络编程(UDP协议-聊天程序)
- 第十一章、认识与学习 BASH 数据流重导向
- 只允许input框输入数字,输入其他的键的时候,直接不显示的方法
- Oracle- PL/SQL DEV的远程配置
- sql2008_x64 读取excel
- 使用 StoryBoard 的时候加入用户引导页面
- IDF实验室-简单的ELF逆向 writeup
- 汽车行业DMS系统介绍