Java反射

来源:互联网 发布:win10 linux bash 编辑:程序博客网 时间:2024/06/18 13:03
创建类类型的三种方式:1、Class  class1=Foo.class;  实际在告诉我们,任何一个类都有一个隐含的静态成员变量2:、Class  class2=foo1.getClass();已知该类的对象,通过该类的对象通过getClass方法,class1和class2表示Foo类的类 类型(class type)  Foo这个类本身就是一个对象,Foo类的对象,万事万物皆对象3、Class class3=null;  
    class3=Class.forName(“类的全称”);   class1==class2==class3
静态加载与动态加载:
       编译时加载的类是静态加载类, 静态加载类,在编译时刻加载所有可能用到的类       运行时加载的类是动态加载类,编译时刻不会报错,运行时再报错
静态加载:
public class OfficeTest {//当Excel类不存在,但是只想用Word时,Excel在编译时就出错导致Word也不能用//这时需要动态加载类,在运行时在判断public static void main(String[] args) {if("Word".equals(args[0])){Word word = new Word();word.start();}if("Excel".equals(args[0])){Excel excel = new Excel();excel.start();}}}
动态加载:
public class OfficeTest {//创建一个接口,让Word实现这个接口,然后动态加载类,在强转成传进来的参数,//这样Excel类不存在也不会互相干扰报错,以后想升级也不用改代码,直接添加类实现接口方法public static void main(String[] args) {try {Class c = Class.forName(args[0]);OfficeAble oa = (OfficeAble)c.newInstance();oa.start();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
public interface OfficeAble {public void start();}

通过反射了解集合泛型的本质1:反射的操作都是编译之后的操作;就是运行阶段2:java中集合的泛型是防止错误输入的;只在编译阶段有效,只要绕过编译就无效啦我们可以通过方法的反射来操作,绕过编译eg:ArrayList list1=new ArrayList();ArrayList<String> list2=new ArrayList<String>();Class c1=list1.getClass();Class c2=list2.getClass();System.out.print(c1==c2);//true
  
 / *
   *  getMethod(方法名,方法参数数组)获取的是public的方法,getDeclaredMethod()获取的是自己声明的方法;   *  方法的反射操作是用方法的对象来进行方法的调用和类对象调用方法的效果是类似的;Object o=m.invoke(a1,new Object[]{10,20});方
   *  法如果没有返回值,则o为null,否则返回具体的返回值
   */Method m=c2.getMethod("add",Object.class);m.invoke(list2,20);//向list2集合中添加一个int 型的值;绕过编译当然是不能直接foreach list2集合的,会报类型转换错误



原创粉丝点击