zoukankan      html  css  js  c++  java
  • 反射

    万事万物皆对象,类本身也是一个对象,是java.lang.Class类的对象。由于java.lang.Class源码中的构造方法是private,外界不能访问,因此不能new一个类对象。
     
    类类型(class type)的三种表示方法:
    1.Class c1=Foo.class;
    2.Class c2=foo1.getClass();
    3.Class c3=null;
       c3=Class.forName("类的全限定名");   /** 
    第三种方法代表动态加载类
    **/
     
     
    通过类类型可以创建该类的对象实例,即通过c1,c2,c3可以创建Foo的实例对象
    Foo foo1=(Foo)c1.newInstance();
    现在就可以通过foo1调用Foo类的各种方法。
     
     
    编译时刻加载类称是静态加载类,运行时刻加载类是动态加载类
    new创建对象是静态加载类,在编译时刻就需要加载所有的可能使用到的类
    动态加载类,在需要某个类的时候加载类(只需要实现某个特定的接口即可),不需要某个类的时候不加载,原来的类不需要修改代码,这样每添加一些新的功能,就可以在线升级,而不需要重新编译原来的源代码。
     
     
    基本数据类型的类类型:
    Class c1=int.class;
    Class c2=String.class   (String类的字节码文件)
    Class c3=double.class
    Class c4=Double.class(c3和c4是不一样类类型)
    Class c5=void.class
     
     
    通过字节码文件(.class)获取类的所有信息:
    Class c=Foo.class;
    Method[] ms=c.getMethods();/**获取的是所有的public函数,包括从父类继承来的函数**/
    Method[] ms=c.getDeclaredMethods();       获取的是所有该类自己声明的方法,不问访问权限,private 的也可以得到
     
    ms[i].getReturnType();获得方法的返回值类类型,如int.class,String.class
    ms[i].getName();返回方法的名称
    ms[i].getParameterType();获得的是参数列表的类型的类类型
     
    Field[] fs=c.getDeclaredFields();获得所有的成员变量的信息
    fs[i].getType();成员变量的类型,是类类型
     
    构造函数也是对象,java.lang.Constructor中封装了构造函数的信息
    Constructor[] cs=c.getDeclaredConstructors();
     
     
    方法调用:
    Method m=c.getDeclaredMethod(方法的名称,参数列表); /**这样能够唯一确定一个方法**/
    m.invoke(类的实例变量,参数列表);        /**m.invoke(a,10,20)**/
    相当于A a=new A();
              a.print(10+20);
     
    编译之后集合的泛型是去泛型化的,也就是集合在经过编译之后,泛型已经不存在了。
    java中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译就无效了。
     
    获得类对象的属性描述:
    PropertyDescriptor[] ps=Introspector.getBeanInfo(类的字节码文件).getPropertyDescriptors();
    for(PropertyDescriptor propertydesc:ps){
        propertydesc.getName();//获得属性的名称
        Method setter=propertydesc.getWriteMethod();//获得属性的setter方法
        setter.invoke(bean,value);//Spring的依赖注入,把value对象动态的注入到bean的某个属性中。
     
    }
  • 相关阅读:
    解决windows上安装TortoiseSVN后不能使用命令行问题
    Python里Pure paths、PurePosixPath、PureWindowsPath的区别
    PHP数组运算符
    global,local,static的区别
    echo和print的区别
    PHP中foreach循环传值问题
    Matlab入门学习(文件读写)
    Matlab入门学习(程序设计)
    IDEA中使用Maven下载依赖时报错:unable to find valid certification path to requested target
    全国县市区编码表
  • 原文地址:https://www.cnblogs.com/james111/p/6607346.html
Copyright © 2011-2022 走看看