zoukankan      html  css  js  c++  java
  • 反射机制笔记

    反射机制:

     反射 Reflectoin
    反射机制是Java的一个非常重要的机制。一
    些著名的应用框架都使用了此机制。
    例如,
    struts, spring, hibernate
    android app的界面设计器 …
    在设计应用框架时一般都要使用反射,它是
    Java的一个非常优越的特性。
     
    例如,
    Class cls = Student.class;
    System.out.println("Name: " + cls.getName());
    其中,cls这个对象就是这个Class的描述。
    再例如,
    Student obj = new Student(); 
    Class cls = obj.getClass();
    其中,obj是一个对象,obj.getClass()则是获取它的Class
    描述。
     
    Class的作用
      用于判断一个运行时对象的类型
    public static void test1(Object obj)
    {
    Class cls = Student.class;
    if(cls.isInstance(obj))
    {
    }
    }
    其中,cls.Instance(obj)意思是判断obj是否为my.Student
    的一个实例
     
    另一种写法,也可以判断一个运行时对象的类型
    public static void test2(Object obj)
    {
    String clsName = obj.getClass().getName();
    if(clsName.equals("my.Student"))
    {
    }
    }
    其中,obj.getClass()可以得到对象obj的具体类型
     
    应用展示
    让一个对Student对象可以与String和Integer进行比较。。。
    public boolean equals(Object obj)
    {
    // 与一个String对象比较
    if(String.class.isInstance(obj))
    {
    String other = (String)obj;
    return other.equals(this.name);
    }
    // 与一个Integer对象比较
    if(Integer.class.isInstance(obj))
    {
    Integer other = (Integer)obj;
    return this.id == other;
    }
    return false;
    }
     
     
    Reflection
    给定一个*.class文件中,我们可以得到以下信息:
     类名 (含package路径)
     函数 (名称,参数类型,返回值)
     域 (名称,类型)
     实现的接口 (interfaces)
    … …
    使用java.lang.reflect.*下的类来实现
    动态加载一个*.class文件到内存:
    // 加载my/Student.class
    Class cls = Class.forName("my.Student");
    // 获取函数列表
    Method[] methods = cls.getMethods();
    // 获取成员变量列表
    Field[] fields = cls.getFields();
    也就是说,虽然我们不知道Student类的代码,但是这个
    class文件本身可以反映(reflect)出这些信息。。。
     结论:通过Reflection机制,我们可以直接
    从class文件反推出它有哪个成员变量、有哪
    些函数
     
    例1 遍历Method 已经函数名,找到对象的 Method
    Class cls = …
    String methodName = "setId";
    // 获取所有Method列表,顺序比对
    Method[] methods = cls.getMethods();
    for(Method m : methods)
    {
    if(m.getName().equals(methodName))
    {
    break;
    }
    }
     
    例2 查找Method 
    已经函数名,参数列表,寻找Method
    Class cls = …
    String methodName = "setId";
    Class[] parameterTypes = { int.class };
    Method m = cls.getMethod(methodName, 
     parameterTypes);
     
     
    例3 Reflection的运用
    // 创建一个实例, 要求有一个不带参数的构造函数
    Object obj = cls.newInstance();
    // 找到method
    Class[] parameterTypes = { int.class };
    Method m1 = cls.getMethod("setId", 
     parameterTypes);
    // 调用method
    Object[] paramters = { 123 };
    m1.invoke(obj, paramters);
     
    更多细节 Class Loader
    Class.forName(…) 可以加载一个class文件。。
    (1)由谁负责加载?
    由Class Loader负责加载,具体地讲,JVM提供了一
    个内置的 bootstrap class loader。
    (2)从哪里加载?
    从classpath下寻找class,以及该class里面import
    的class
     
     
     
     
  • 相关阅读:
    Feature hashing相关
    损失函数(Loss Function) -1
    Android系统容量检测 —— Environment 和StatFs
    android 图像处理(黑白,模糊,浮雕,圆角,镜像,底片,油画,灰白,加旧,哈哈镜,放大镜)
    android中listview的一些样式设置
    Android代码调试报错
    珍藏40个android应用源码分享
    Android应用中菜单(Menu)的位置显示问题
    解决android4.0系统中菜单(Menu)添加Icon无效问题
    android自定义title
  • 原文地址:https://www.cnblogs.com/qinchangchuan/p/10729708.html
Copyright © 2011-2022 走看看