一、ClassLoader初步
类加载器负责加载所有的类,系统为所有被载入内存中的类生成一个java.lang.Class实例。一旦一个类被载入到JVM中,同一个类就不会再次被载入了,这是针对同一个加载器,不同的加载器还是可以加载同一个类的,不同加载器加载同一个类在JVM中是不同的。因为在JVM中用类的全限定类名加类加载器作为其唯一标识。
在JVM启动时,会形成有三个类加载器组成的初始类加载器层次结构:
-->Bootstrap ClassLoader:根类加载器
-->Extension ClassLoader:扩展类加载器
-->System ClassLoader:系统类加载器
Bootstrap ClassLoader是使用C++写的,我们是无法得到他的,他是java的核心Loader,比如我们通过String.class.getClassLoader()是获得不到他的名字的,返回的是空值。
如果父类加载器加载了某个类,子类就不会加载了。
ClassLoader动态加载:
a.并非一次性加载
b.需要运行时才加载
c.可以观察类的具体加载过程:java -verbose:class 在eclipse中只要配置后面的-verbose:class
d.static语句块在加载后执行一次。
e.dynamic语句块每次new新的对象都会执行
等同于构造方法中的语句。
用的比较少。
具体看参见:http://gzcj.iteye.com/blog/394644
二、使用反射实现JDK动态代理
在java中提供了Proxy类和一个InvocationHandler接口,通过他们俩我们就可以创建JDK动态代理,下面让我们通过一个实例来看看如何使用吧:
Person接口
package com.lyl.reflect;
public interface Person {
void walk();
void sayHello(String name);
}
MyInvocationHandler.java
package com.lyl.reflect;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("正在运行的方法:"+method);
if(args!=null){
System.out.println("执行该方法传入的参数:");
for(Object arg:args){
System.out.println(arg);
}
}else {
System.out.println("该方法没有传入参数!");
}
return null;
}
}
ProxyTest.java
package com.lyl.reflect;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args) {
InvocationHandler handler=new MyInvocationHandler();
//返回Person接口的代理类实例
Person person=(Person)Proxy.newProxyInstance(Person.class.getClassLoader(), new Class[]{Person.class}, handler);
person.walk();
person.sayHello("ITEYE");
}
}
通过Proxy类的newProxyInstance()方法我们可以获得一个指定接口的代理类实例,在MyInvocationHandler中会自动执行invoke方法,执行结果如下:
正在运行的方法:public abstract void com.lyl.reflect.Person.walk()
该方法没有传入参数!
正在运行的方法:public abstract void com.lyl.reflect.Person.sayHello(java.lang.String)
执行该方法传入的参数:
ITEYE
分享到:
相关推荐
详细讲解了java反射技术,简单易懂,可以很轻松的学习java的反射机制
在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...
java反射技术应用的很广泛,多看源码,对理解java反射的理解会有很好的认识,这个源码有我自己的理解在里边
反射本身是JAVA 语言的特性,使JAVA 语言有一种在运行时态自“自观”的能力。而 其他面向对象的语言却没有类似的功能。
使用 Java 反射封装 JavaBean <br> 说明:这个程序在没有使用Hiberante时挺有用的 需要一个数据库查询语句 对应的JavaBean的全名(现在是Class,原来Class.getName()) 返回List包含多个JavaBean
解析Java反射技术讲解如何将字符串变成java中的对象
Java反射机制的使用和学习方法,从底层阐述Java反射机制的原理,让我们更加了解Java反射
对初学者而言这是一个不错的对jdbc学习的资源。
java反射经典实例 看完之后,基本满足你要做的事情,其中包括修改各种私有属性,调用私有方法的例子代码。简单干练。
Java反射技术指的是在运行时动态地获取类的信息、调用对象的方法、操作类的属性等能力。通过反射,程序可以在运行时检查类、实例化对象、调用方法、获取和设置属性,甚至可以动态修改类的结构。 Java反射技术的核心...
java学校必备技术,反射是java的核心,精通反射,做程序开发易如反掌
java反射机制.doc
运行程序,指定一个要分析的类名称,如java.lang.Double,输出类中声明的属性、方法、构造函数等。
利用Java反射、IO、图形化技术相结合实现的一个类搜索小工具,可以直观的看到效果,代码不多,注释齐全,适合初阶段学习。
Java反射机制Java反射机制Java反射机制Java反射机制
java 反射技术
Java反射技术浅谈
Java反射源码 反射技术
Java反射学习.pdf