ClassLoader和Reflect
什么情况下使用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());
}
}
这是平时写代码的时候,比较有用的技巧。
ClassLoader和Reflect的更多相关文章
- Zeppelin使用Spark的yarn-client模式
Zeppelin版本0.6.2 1. Export SPARK_HOME In conf/zeppelin-env.sh, export SPARK_HOME environment variable ...
- spark 2.X 疑难问题汇总
当前spark任务都是运行在yarn上,所以不用启动长进程worker,也没有master的HA问题,所以主要的问题在任务执行层面. 作业故障分类故障主要分为版本,内存和权限三方面. - 各种版本不一 ...
- Android动态部署五:怎样从插件apk中启动Service
转载请注明出处:http://blog.csdn.net/ximsfei/article/details/51072332 github地址:https://github.com/ximsfei/Dy ...
- https://stackoverflow.com/questions/16130292/java-lang-outofmemoryerror-permgen-space-java-reflection
https://stackoverflow.com/questions/16130292/java-lang-outofmemoryerror-permgen-space-java-reflectio ...
- Zeppelin 0.6.2使用Spark的yarn-client模式
Zeppelin版本0.6.2 1. Export SPARK_HOME In conf/zeppelin-env.sh, export SPARK_HOME environment variable ...
- JVM:类加载与字节码技术-2
JVM:类加载与字节码技术-2 说明:这是看了 bilibili 上 黑马程序员 的课程 JVM完整教程 后做的笔记 内容 这部分内容在上一篇笔记中: 类文件结构 字节码指令 编译期处理 类加载阶段 ...
- java-反射-注解-json-xml
反射: 框架设计的灵魂 框架:半成品软件.可以再框架的基础上进行软件开发,简化代码 定义:将类的各个组成部分封装为其他对象,这就是反射机制 好处: 可以再程序运行过程中,操作这些对象 可以解耦,提高程 ...
- day11 Java反射机制
java反射机制 反射是java中的动态机制,它允许我们在程序运行期间再确定类的实例化,方法的调用,属性的调用等,而不是传统意义上的在编码期间确定. 因此,反射可以大大的提高代码的灵活度,但是随之而来 ...
- java 编程基础 Class对象 反射:动态代理 和AOP:java.lang.reflect.Proxy:(Proxy.newProxyInstance(newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h))
为什么我们使用动态代理 静态代理会让类变多了,多了代理类,工作量变大了,且不易扩展.比如我们上节课的例子,要实现不同的扩展方法就要编写不同的代理类,非常麻烦. Proxy类的使用规则 Proxy提 ...
随机推荐
- 总结2015搭建日志,监控,ci,前端路由,数据平台,画的图与界面 - hugo - ITeye技术网站
总结2015搭建日志,监控,ci,前端路由,数据平台,画的图与界面 - hugo - ITeye技术网站 极分享:高质分享+专业互助=没有难做的软件+没有不得已的加班 极分享:高质分享+专业互助=没有 ...
- Java File 类的使用方法详解
Java File类的功能非常强大,利用Java基本上可以对文件进行所有的操作.本文将对Java File文件操作类进行详细地分析,并将File类中的常用方法进行简单介绍,有需要的Java开发者可以看 ...
- adb不响应
1.CMD命令窗口输入:adb nodaemon server .然后就会提示你哪个端口被占用了. 2.输入netstat -ano | findstr "5037" .然后会弹出 ...
- Delphi监视进程并结束进程
监视进程并结束进程在很多地方都用到这里借前人的经验写了个小例子: 以QQ的进程qq.exe为例 关键代码如下: function CheckTask(ExeFileName: string): Boo ...
- 【UNIX】select、poll、epoll学习
三者都是UNIX下多路复用的内核接口,select是跨平台的接口,poll是systemV标准,epoll是linux专有的接口,基于poll改造而成. select 函数原型: int select ...
- jsp值传到后台Struts2中的action三种方法
Action接收表单传递过来的参数有3种方法: 如,登陆表单login.jsp: <form action="login" method="post" n ...
- cocos2d-x 判断点击命中坐标的几种方法
转自:http://www.cnblogs.com/jiackyan/archive/2013/04/14/3019893.html //重载 virtual bool ccTouchBegan(CC ...
- const和readonly差别
我们都知道,const和static readonly的确非常像:通过类名而不是对象名进行訪问,在程序中仅仅读等等.在多数情况下能够混用.二者本质的差别在于,const的值是在编译期间确定的,因此仅仅 ...
- ThinkPHP CURD方法盘点:order方法
order方法属于模型的连贯操作方法之一,用于对操作的结果排序. 用法 $Model->where('status=1')->order('id desc')->limit(5)-& ...
- jQuery遍历json
使用 each var anObject = {one:1,two:2,three:3}; $.each(anObject,function(name,value) { alert(name); al ...