您的位置:首页 > 编程语言 > Java开发

java EE开发之Servlet第九课:反射基础一

2017-02-06 15:48 253 查看

一.Class对象

反射:动态编译、可以更好的发挥java的灵活性以及更好的运用java的多态Class类型:任何一个java程序编译后都会形成一个class类型的文件,这个class文件就是把java代码进行编译后能够被计算机所认识的字节码。这个class文件有一个与之对象对应的java类型–Class类型,Class类型中可以包括当前的class文件中属性、方法、构造方法等。

Class类型又称为模板类:获取任意的的Class类型的对象有四种方式

Class是类的类,它的一个实例,就是一个类对像,记录这个类的信息(包括有哪些属性 和方法)

(1).得到Class对象

String s = new String("abc");


得到String类的类对象,这个Class类同样是继承Object类,这个类对象包含着String类的信息(有哪些属性,哪些方法等信息)

使用对象.getClass()得到类对象

Class c1 = s.getClass();


使用类名.class得到类对象

Class  c2 = String.class;


通过字符串得到类对象

Class c3 = Class.forName("java.lang.String");


区别:

Class A{
当类在加载时会自动调用static静态块的代码
static{ System.out.println("A");}
}


延时加载(不会打印静态块的代码)

加载类,但是没有马上加载,只有当new出这个类的对象时才会加载

Class c1 = A.class;
c1.newInstance();


即时加载(会马上打印静态块的代码)

Class c2 = Class.forName("com.accp.test.A");


(2).得到一个类所有的父类

Class c = ArrayList.class;
while(c!=null){
System.out.println(c.getName());
c = c.getSuperclass();
}


(3).基础类和包装类

得到基础类和包装类


Class c1 = Integer.class;
//c1.getName()-----java.lang.Integer


Class c2 = int.class;
//c2.getName()-----int


在jdk1.5版本之后

Class c3 = Integer.TYPE;
//c3.getName()-----int


二.类加载器

Classloader 类加载器,用来加载Java类到 Java 虚拟机中的一种加载器。

与普通程序不同的是。Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。

想了解更多关于Classloader相关概念请读者移步:http://baike.baidu.com/item/classloader

引用块内容

得到系统的类加载器(注意也是延时加载)

ClassLoader loader = ClassLoader.getSystemClassLoader();
Class c = loader.loadClass("com.accp.test.A");
System.out.println(c.getName());


拿出所有的加载器

public static void main(String[] args){

//系统加载器
ClassLoader cl =  ClassLoader.getSystemClassLoader();
loader(cl);
}
public  static void loader(ClassLoader cl){
if(cl!=null){
System.out.println(cl.getClass().getName());
//得到父类加载器
cl = cl.getParent();
loader(cl);
}
}


类加载器是从classpath路径中加载类

例子:在d: 写一个A类,在main方法中调用在f盘的B类的一个方法,然后编译完成以后,在c盘使用java 命令运行 classpath=”.;d:\;e:\”这里的意思就是先到当前的路径找class文件,如果没找到,然后到d:\下面找,如果还没找到e:\找

三.加载器的分类以及加载分类

写一个A类,打印”A—-A”.然后将A类打包,放到jdk的安装目录下面jdk1.5.0_05\jre\lib\ext的文件夹下,然后改写A.java,重新编译打印的还是原来的A类的内容



向上委托原则

系统加载器收到加载类的请求时,自己先不加载,而是委托父加载器(Ext)进行加载Ext此时就会收到请求,但也不先自己加载,而是继续向上委托你加载器(BootStrap)加载当根加载器判断不属于其加载的内容,就进行权力的下放,此时Ext才开始加载。

一致性原则

任何的一个class文件被一个加载器加载后,其它的加载器就不再加载因为需要保持版本的一致

(向上)透明性原则

就是底层的加载器,可以看到顶层加载器所加载的的容

所以我们的自定义程序可以去调用根加载 加载的核心API中的内容

四.网络加载类

默认的加载器只能从本地加载

使用urlClassLoader加载器(自己定义的加载器也叫远程加载)

i.首先,把类打成压缩包放到一个web项目中

ii.然后,把当前项目中该类的class文件删除

iii.最后,在当前项目的main方法中写到

网络加载

记得把jdk1.5.0_05\jre\lib\ext下面的包删掉

URL url = new URL("http://localhost:8888/test/lib/a.jar");
URL[] urls = new URL[]{url};
ClassLoader loader = new URLClassLoader(urls);
Class c = loader.loadClass("A");
c.newInstance();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: