• Java类型信息


    一、类型信息RTTI

      1、class.getInterfaces 可以获取到当前类实现的接口数组(注:不包括父类实现的接口)。

      2、为使用类而做的准备三步骤

        1)类加载器进行加载;2)链接:验证类的字节码,为静态域分配存储空间;3)初始化:初始化父类,执行静态初始化器与静态初始化块。

        当使用字面常量引用class时,会发生前两个步骤(Class initiable = Initable.class);而引用类静态基本类型的常量时也不发生初始化 (static final int staticFinal= 47),其他情况会导致初始化步骤(static final Integer staticFinal= 47;static final int staticFinal2 = hello.rand.nextInt(1000); static int staticNonFinal= 47;)

      3、对Class使用泛型,如 Class<?>, Class<? extends Number> 前者接受任意类型,后者接受Number子类。Class<Number>不能接受Number子类如int

      4、类型的动态判断  "zcs" instanceOf String, String.class.isInstance("zcs");  这两种判断方式都考虑了继承体系,也就是子类对象也属于父类的实例。

      5、实现一个抽象工厂   

    interface Factory<T>{ T create();}
    
    class Part{
        static List<Factory<? extends Part>> partFactories = new ArrayList<Factory<? extends Part>>();
        static{
            partFactories.add(new FuelFilter.Factory());
        }
    }
    
    class Filter extends Part{}
    class FuelFilter extends Filter{
        public static class Factory implements test.Factory<FuelFilter>{
            public FuelFilter create(){
                return new FuelFilter();
            }
        }
    }
    View Code

    二、反射

      RTTI于反射之间主要区别在于,打开class文件的时机,RTTI要求在编译期就能够打开,而反射则是在运行期。

      1、通过Class获取三种属性:hello.class.getMethods,hello.class.getConstructors,hello.class.getFields

      设计模式的关键就是封装修改。

      2、动态调用函数  

         public static void print(String ss,String aa)       

         Method method = hello.class.getDeclaredMethod("print",new Class[]{String.class,String.class}); method.setAccessible(true);
         /
    /由于print是static方法,因此第一个参数可以传递null
         method.invoke(new hello(), "zhongchangshou hahah","zhongchangchu");

       3、通过反射可以调用任何类的私有成员,只要知道其函数名字  

        private void print(){
            System.out.println("I'm hide.");
        }
    
        Method method = hello.class.getDeclaredMethod("print");
        method.setAccessible(true);
        method.invoke(new hello());

       即使对于已经编译的代码,使用 javap -private C 方式可以显示所有成员,包括私有成员,然后有这些名字后就可以通过反射调用。 

    javac test/hello.java
    javap -private -C test.hello
  • 相关阅读:
    mongodb 数组批量插入
    iOS 5 Storyboard 学习之 Tabbar Controller,Navigation Controller (2) 代码部分
    【PPT资料】淘宝商品库MySQL优化实践
    ASIHTTPRequest用户登陆:重复用户登陆问题解决
    让Oracle索引Null列
    视图学习:v$Latch (X$KSLLT) 与 v$Latch_Children(X$KSLLT, X$KSLLD)
    sed替换字符时< ' /等符号的处理
    【PPT资料】视觉中国的MongoDB应用实践(QConBeijing2011)
    如何正确的给innodb表空间添加数据文件
    iOS 5 Storyboard 学习之 Tabbar Controller,Navigation Controller (1)
  • 原文地址:https://www.cnblogs.com/chang290/p/3410994.html
Copyright © 2020-2023  润新知