-
CLASS查看全部
-
动态加载类查看全部
-
new 创建对象是静态加载类,在编译时刻就需要加载所有可能用到的类查看全部
-
动态加载类 通过Class.forName("类的全称")表示的Class实例不仅表示类的类类型,还代表了动态加载类(即在编译阶段不会被检查). 通过new创建对象是静态加载类. (即在编译阶段会检查Java类中引用的类是否存在,但并不会执行类的加载过程,类加载需要运行阶段). 静态加载类 class office{ public static void main(string [] args) { if("Word".equals(args[0])) { Word w=new Word(); } if("Excel".equals(args[0])){ Excel e=new Excel(); } } 假设存在Word类,但不存在Excel类. 因为通过new关键字创建对象,属于是静态加载类,在编译时刻需要检查java类中引用到的类是否存在,语法是否合法. 若类不存在,则不能通过编译,程序也运行也不起来. 动态加载类 若Word、Excel类实现OfficeAble接口. class office{ public static void main(string [] args) { Class c= Class.forName(args[0]); OfficeAble oa=(OfficeAble)c.newInstance(); } 动态加载类可以通过编译,尽管Excel类、Word类都不存在也可以通过编译. 若存在Word类,不存在Excel类,则当运行时输入"Excel",用到Excel类才会报错,只用Word类程序依然可以执行. 添加Excel类之后,不需要再重新编译office这个类,即不用修改office这个类的代码.编译Excel类即可. 功能性的类尽量使用动态加载,而非静态加载.查看全部
-
静态的成员,普通数据类型类不是对象查看全部
-
Class类的表示方式(三种). 创建了一个Foo类,并且实例化对象. Foo foo1=new Foo(); 1.通过创建的Foo类的静态成员变量class获取Class实例.即任何一个类都有一个隐含的静态成员变量class. Class c1=Foo.class; 2.已经知道该类的对象(该类非指Class类,而是指Class类的实例,即Foo),通过对象的getClass()方法获取. Class c2=foo1.getClass(); 3.直接通过类名(全称)获取 Class c3=Class.forName("com.imooc.Foo");//会声明异常. c1==c2==c3,它们是同一个对象.不管c1还是c2还是c3,都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象. 我们可以通过类的类类型(即类的class对象)创建该类的实例对象.即可通过c1、c2、c3创建Foo的实例对象. Foo foo2=(Foo)c1.newInstance();//需要强制转换,创建出来的是Foo类的实例对象. newInstance()方法会调用要创建的对象所对应的类的无参构造方法,所以类(Foo类)中必须要有无参的构造方法.查看全部
-
Class类 在java中静态的成员(变量与方法)、普通数据类型类(int double)不是面向对象的,但普通数据类型类有其包装类是面向对象的. 我们写的每一个类,api提供的每一个类都看成是一个对象.类也是对象,类实例出来的对象也叫对象. 类是java.lang.Class类的实例对象.所有类,包括自定义的类与api提供的类都是Class类的实例对象(即任何一个类都是Class类的实例对象),即任何一个类都有且仅有一个其对应的Class对象(类类型). Class这个Java类保存的是一个Java类的meta信息(元信息)一般在反射中使用. Object类,是所有Java类的根,包括Class类. 假如自定义一个Foo类,则Foo的实例对象表示方法为:Foo foo1=new Foo();,通过new关键字.但Foo类本身也是一个实例对象,是Class类的实例对象. Class类有一个私有的构造方法,只有java虚拟机能实例化Class的对象.我们没有办法直接通过new关键字实例化对象.查看全部
-
Java反射机制——通过反射了解集合泛型的本质 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 Method m=c2.getMethod("add",Object.class); m.invoke(list2,20);//向list2集合中添加一个int 型的值;绕过编译 当然是不能直接foreach list2集合的,会报类型转换错误查看全部
-
!!(重点)方法的反射(作用) A a1=new A()--获取类对象; Class c1=a1.getClass();--获取A类的类类型 Method:/*eg,public void 对象{int a,String b} 获取方法:Method m=c1.getMethod(方法名,参数列表(int.class,String.class/ new Class[](){int.class,String.class})) 使用方法:Object o=m.invoke(方法对象(a1),参数列表) /以前:a1.方法名(12,"cl"); 无返回使用方法:m.invoke(方法对象(a1),参数列表(12,"cl")) /*有返回值返回具体值给o,无返回值返回null//查看全部
-
Constructor:/*存储所有构造函数到cs: Constructor[] fs=cl.getDeclaredConstructor()*/ cs.getName() /*得到构造函数名称 cs.getParameterTypes() /*获得参数类型->得到参数列表的类型的类类型 /*存储所有类类型到parameter:Class[] parameter=cs[i].getParameterTypes()*/查看全部
-
Field:/*存储所有方法到fs:Field[] fs=c1.getFields()*/ fs.getType() /*得到成员变量的类型的类类型 /*存储所有类类型到field:Class fiedl=fs[i].getType()*/ fs.getName() /*得到成员名称查看全部
-
反射的操作都在编译之后的 泛型是为了避免输入错误 绕过编译就没有效果了查看全部
-
方法的反射查看全部
-
基础步骤查看全部
-
方法的反射查看全部
举报
0/150
提交
取消