java反射.ppt_第1页
java反射.ppt_第2页
java反射.ppt_第3页
java反射.ppt_第4页
java反射.ppt_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java 类型信息,获取java运行的时候的类型信息有两种方式: 一RTTI 二Java反射,RTTI,为什么需要RTTI 在运行时,识别一个对象的类型 列子: 当从数组中取出元素时,这种容器实际上它将所有的事物都当作Object持有会自动将结果转型回Shape。这是RTTI最基本的使用形式,因为在Java中,所有的类型转换都是在运行时进行正确性检查的 也正是这样要求的;您希望大部分代码尽可能少地了解对象的具体类型,而是只与对象家族中的一个通用表示打交道(在这个例子中是Shape)。这样代码会更容易写,更容易读,且更便于维护;设计也更容易实现、理解和改变。,Java反射,Class对象 Jvm

2、的内存有一个运行时候数据区,其中有一个方法区,方法区内主要装载的是类的类型信息,jvm加载某个类得时,读取class时候 就提取class的类型信息存储到方法区中。 Class 类是java一个基础类,没装载一个新的类得时候,java虚拟机就会在java堆中,创建一个class的是实例,这个实例就代表这个class类型,通过实例获取类型信息 Method 类 的方法信息 Constructor 构造器类 Field 字段类,Java反射应用,返回一个类型引用几种方式 Class cls= Class.forName(“) 返回一个类型 基本数据类 Class cls= Int.class 或者

3、 Class cls= Interger.type 自定义类 Class cls= myClass.class 通过类得引用创建实例 cls.newinstace(); 通过newinstace创建实例时候 需类有一个 可访问的 无参数的构造函数 一般默认的那个构造函数即可,Java反射应用,Method 类中 invoke 反射 invoke方法 对带有指定参数的指定对象调用由此 Method 对象表示的基 础方法 介绍invoke 方法的使用 public class ClassA public void add(Integer param1, Integer param2) System

4、.out.println(Value() + Value(); public void StringAdd(String abc) System.out.println(out + abc); public static void main(String args) try Method mth = ClassA.class.getMethod(add, new Class Integer.class, Integer.class ); mth.invoke(ClassA.class.newInstance(), new Integer(1), new

5、Integer(2); Method mth1 = ClassA.class.getMethod(StringAdd, new Class String.class ); mth1.invoke(ClassA.class.newInstance(), -test); catch (Exception e) -output- 3 Out-test,Java动态代理,java.lang.reflect.Proxy 这是 Java 动态代理机制的主类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象。 /该方法用于获取指定代理对象所关联的调用处理器 static InvocationHand

6、ler getInvocationHandler(Object proxy) / 该方法用于获取关联于指定类装载器和一组接口的动态代理类的类对象 static Class getProxyClass(ClassLoader loader, Class interfaces) / 该方法用于判断指定类对象是否是一个动态代理类 static boolean isProxyClass(Class cl) / 该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例 static Object newProxyInstance(ClassLoader loader, Class interfa

7、ces, InvocationHandler h) java.lang.reflect.InvocationHandler 这是调用处理器接口,它自定义了一个 invoke 方法,用于集中处理在动态代理类对象上的方法调用,通常在该方法中实现对委托类的代理访问。 / 该方法负责集中处理动态代理类上的所有方法调用。第一个参数既是代理类实例,第二个参数是被调用的方法对象 / 第三个方法是调用参数。调用处理器根据这三个参数进行预处理或分派到委托类实例上发射执行 Object invoke(Object proxy, Method method, Object args),Java动态代理实例,抽象角色

8、: interface Subject public void request(); 真实角色:实现了Subject的request()方法。 class RealSubject implements Subject public RealSubject() public void request() System.out.println( “ From real subject. ” ); 代理角色: 必须继承InvocationHandler import java.lang.reflect.Method; import java.lang.reflect.InvocationHandle

9、r; class DynamicSubject implements InvocationHandler private Object sub; public DynamicSubject() public DynamicSubject(Object obj) sub = obj; public Object invoke(Object proxy, Method method, Object args) throws Throwable System.out.println( before calling + method); method.invoke(sub,args); System.

10、out.println( after calling + method); return null ; 客户端调用: import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class Client static public void main(String args) throws Throwable RealSubject rs = new

11、 RealSubject(); / 在这里指定被代理类 InvocationHandler ds = new DynamicSubject(rs); Class cls = rs.getClass(); / 以下是一次性生成代理 Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(),ds ); subject.request(); ,Java 反射扩展jvm加载类原理,类加载器 Classloader Classload默认加载器(根加载器、扩展加载器、系统加载器

12、),自定义加载器,Jvm 类加载原理二,JVM自带的默认加载器 1):根类加载器:bootstrap,由C+编写,所有Java程序无法获得。 2):扩展类加载器:由Java编写。 3):系统类、应用类加载器:由Java编写。 用户自定义的类加载器: java.lang.ClassLoader的子类,用户可以定制类的加载方式。每一个类都包含了加载他的ClassLoader的一个引用getClass().getClassLoader()。 如果返回的是null,证明加载他的ClassLoader是根加载器bootstrap。,Jvm类加载器原理三,类的加载方式 1):本地编译好的class中直接加

13、载 2):网络加载:.URLClassLoader可以加载url指定的类 3):从jar、zip等等压缩文件加载类,自动解析jar文件找到class文件去加载util类 4):从java源代码文件动态编译成为class文件 类加载的步骤 1):类加载load:从字节码二进制文件.class文件将类加载到内存,从而达到类的从硬盘上到内存上的一个迁移, 所有的程序必须加载到内存才能工作。将内存中的class放到运行时数据区的方法区内,之后在堆区建立一个 java.lang.Class对象,用来封装方法区的数据结构?类加载的最终产物就是堆中的一个java.lang.Class对象。 2):连接:连接

14、又分为以下小步骤 验证:出于安全性的考虑,验证内存中的字节码是否符合JVM的规范,类的结构规范、语义检查、字节码操作 是否合法、这个是为了防止用户自己建立一个非法的XX.class文件就进行工作了,或者是JVM版本冲突的问 题,比如在JDK6下面编译通过的class(其中包含注解特性的类),是不能在JDK1.4的JVM下运行的。 准备:将类的静态变量进行分配内存空间、初始化默认值。(对象还没生成呢,所以这个时候没有实例变量什么事情) 解析:把类的符号引用转为直接引用(保留) 3):类的初始化: 将类的静态变量赋予正确的初始值,这个初始值是开发者自己定义时赋予的初始值,而不是默认值。,Jvm类加

15、载器原理四,ClassLoader的关系: 根加载器扩展类加载器应用类加载器用户自定义类加载器 如果到最后一层都再加载不了 就出现ClassNotFoundException 异常 可见ClassNotFoundException 有时候并不是类找不到 而且加载器加载出错,Jvm类加载器疑问?,class Singleton public static Singleton singleton = new Singleton(); public static int a; public static int b = 0; private Singleton() super(); a+; b+;

16、public static Singleton GetInstence() return singleton; public class MyTest /* * param args */ public static void main(String args) Singleton mysingleton = Singleton.GetInstence(); System.out.println(mysingleton.a); System.out.println(mysingleton.b); 上面的代码会输出多少呢?,Jvm 类加载深入-动态加载,加载器到底加载哪些类,我们如何知道呢? 通

17、过url 获取加载器的所加载的类 URL urls = sun.misc.Launcher.getBootstrapClassPath().getURLs(); for (int i = 0; i urls.length; i+) System.out.println(urlsi.toExternalForm(); -结果如下:- file:/C:/Program%20Files/Java/jdk1.5.0_22/jre/lib/rt.jar file:/C:/Program%20Files/Java/jdk1.5.0_22/jre/lib/i18n.jar file:/C:/Program%

18、20Files/Java/jdk1.5.0_22/jre/lib/sunrsasign.jar file:/C:/Program%20Files/Java/jdk1.5.0_22/jre/lib/jsse.jar file:/C:/Program%20Files/Java/jdk1.5.0_22/jre/lib/jce.jar file:/C:/Program%20Files/Java/jdk1.5.0_22/jre/lib/charsets.jar file:/C:/Program%20Files/Java/jdk1.5.0_22/jre/classes,Jvm 类加载深入-动态加载2,每个

19、ClassLoader加载Class的过程是: 1.检测此Class是否载入过(即在cache中是否有此Class),如果有到8,如果没有到2 2.如果parent classloader不存在(没有parent,那parent一定是bootstrap classloader了),到4 3.请求parent classloader载入,如果成功到8,不成功到5 4.请求jvm从bootstrap classloader中载入,如果成功到8 5.寻找Class文件(从与此classloader相关的类路径中寻找)。如果找不到则到7. 6.从文件中载入Class,到8. 7.抛出ClassNotF

20、oundException. 8.返回Class.,Jvm 类加载深入-动态加载2,sun.misc.Launcher Launcher 类会在运行时 初始化class loader层次结构 下面是初始化代码: public class Launcher public Launcher() ExtClassLoader extclassloader; try /初始化extension classloader extclassloader = ExtClassLoader.getExtClassLoader(); catch(IOException ioexception) throw new

21、 InternalError(Could not create extension class loader); try /初始化system classloader,parent是extension classloader loader = AppClassLoader.getAppClassLoader(extclassloader); catch(IOException ioexception1) throw new InternalError(Could not create application class loader); /将system classloader设置成当前线程的

22、context classloader(将在后面加以介绍) Thread.currentThread().setContextClassLoader(loader); public ClassLoader getClassLoader() /返回system classloader return loader; ,初始化二,extension classloader的部分代码: static class Launcher$ExtClassLoader extends URLClassLoader public static Launcher$ExtClassLoader getExtClass

23、Loader() throws IOException File afile = getExtDirs(); return (Launcher$ExtClassLoader)AccessController.doPrivileged(new Launcher$1(afile); private static File getExtDirs() /获得系统属性“java.ext.dirs” String s = System.getProperty(java.ext.dirs); File afile; if(s != null) StringTokenizer stringtokenizer

24、= new StringTokenizer(s, File.pathSeparator); int i = stringtokenizer.countTokens(); afile = new File; for(int j = 0; j i; j+) afilej = new File(stringtokenizer.nextToken(); else afile = new File0; return afile; system classloader的部分代码: static class Launcher$AppClassLoader extends URLClassLoader pub

25、lic static ClassLoader getAppClassLoader(ClassLoader classloader) throws IOException /获得系统属性“java.class.path” String s = System.getProperty(java.class.path); File afile = s != null ? Launcher.access$200(s) : new File0; return (Launcher$AppClassLoader)AccessController.doPrivileged(new Launcher$2(s, afile, classloader); ,初始化三,extension classloader是使用系统属性“java.ext.dirs

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论