反射

万事万物皆对象,类本身也是一个对象,是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的某个属性中。
 
}

 

posted @ 2017-03-23 21:08  bili111  阅读(117)  评论(0编辑  收藏  举报