-
Java动态加载类
知识点1:
Class.forName("类的全称"),不仅表示了对象的类类型,还代表了动态加载类。
静态加载类:编译时刻加载类(通过new关键字创建的对象)。
动态加载类:运行时刻加载类(Class.forName(),得到类类型调用newInstance())。
案例:区分编译时刻加载类和运行时刻加载类(使用EditPlus工具,Eclipse表现不明显)。
描述:在 main 函数中,有一个 String args[] 参数,这就表示在执行某 .class 文件时,可以对 main 函数传字符串参数(例如:命令行中:java OfficeBetter Excel,传给主函数的参数就是Excel,如果传多个参数,参数用空格隔开),Office类中使用了两个类(没有提供这两个类),并调用其相应的方法,然后进行编译报错,提示找不到这两个类,我们只提供了Word类和相应方法,并对它进行编译(这是因为只使用Word的功能),这时候再对Office这个类进行编译,这时候只报Excel找不到的错误,现在核心问题是只想使用Word,而不使用Excel这个类,但是报错(这样就不能运行,导致不能使用Word的功能),因为new 对象是静态加载类的方式,在编译时刻就需要加载所有可能使用到的类,但实际应用希望用到哪个类加载哪个类,这样就不会在编译时报错,并且可以运行,所以可以通过动态加载类来解决该问题,通过Class.forName(args[0])动态加载这个类的Class实例对象,通过传入一个类的路径,即使没有这个类,编译时刻也不会报错,但运行时刻会报错,紧接着就可以通过Office的类类型创建Word对象,如果强制转换为Excel类型,但是加载时却是Word类,就可能发生错误,这时就需要给Word和Excel指定一个标准,也就是创建一个接口,并声明相应方法,并且让Word和Excel实现这个接口,如果传入的参数是Excel,只需要再创建一个Excel并实现该接口,这样就不用在主程序中修改类型了,实际应用中功能类通常使用动态加载类。
查看全部 -
Class类的使用
【一】Class类的使用
知识点1:Class类概念。
在面向对象的世界里,万事万物皆对象。
Java语言中,静态的成员和普通数据类型不是对象,静态成员属于类,普通数据类型的包装类是对象。
类是对象,类是java.lang.Class类的实例对象(可以理解为对象是类描述信息的实例,而类是Class描述信息的具体实例)
官网中把一个Foo的Class实例对象称作Foo的类类型,类也是对象,是Class类的实例对象。
知识点2:获取类类型的三种方式。
Class类实例对象的表示方式
Class的构造方法为私有构造方法,所以不可以通过new关键字创建,也就是只有Java虚拟机可以创建Class的实例对象,任何一个类都是Class的实例对象,这个实例对象有三种表示方式。
【a】任何一个类都有一个隐含的静态成员变量class
Class c1=Foo.class。
【b】通过该类的对象调用getClass方法
Class c2=new Foo().getClass();
【c】通过Class的forName("类的全称")。
Class c3=Class.forName("com.imooc.reflect.Foo");
注意: 一个类的Class实例对象只有一个,所以c1==c2==c3。
知识点3:类类型获取类的实例对象。
通过一个类的Class实例对象创建给类的实例。
语法:Foo foo=(Foo)c1.newInstance()。
注意:如果c1是A类的Class实例,则创建的是A类的对象,如果是B类的Class实例,则创建的是B类的对象,并且需要做强制类型转换。
前提:通过类类型调用newInstance()方法创建对象,前体是Foo类要有无参数的构造方法。
【二】方法的反射
【三】成员变量的反射
【四】构造函数的反射
【五】Java类加载机制(包括利用反射机制,在程序运行时刻做的一些操作。java的框架如何利用反射的)
查看全部 -
先了解java反射,因为动态代理中,用到反射,具体如下:
动态代理中,要执行某个类的方法时,先生成该类的代理类,通过代理类去调用目标类的方法,从而可以在代理类中执行 额外的逻辑。为了动态生成代理类,而不事先生成,我们就需要利用到反射。
查看全部 -
在设计方面:
功能性的类,我们尽量去使用动态加载,而不使用静态加载,这样可以使程序更加灵活
查看全部 -
A a=new A();
a是A的一个对象。
而A本身这个类也是java.lang.Class这个类的一个对象
Class c1 = A.class
或者
Class c2 = A.getClass();
c1,c2 表示A类的类类型(class type)
可以这么理解:
A作为类的时候,他就是A,
A作为对象的时候,他就是c1或者c2 ,作为Class这个类的对象。
查看全部 -
如果一个类中涉及到多个类,此时将多个类向上提取接口(众类实现该接口),然后通过动态加载类的方式在运行的时候才创建对象不用的不需要编译就不会报错,这样底层不需要改动,每次增加一个类实现该接口标准就可以也不需要编译officebetter 只需编译新添加的类
查看全部 -
动态加载类
查看全部 -
new 对象的时候都是静态加载类,即在编译时刻就需要加载所有可能用到的类
查看全部 -
编译,静态加载,运行加载,动态加载
查看全部 -
通过 类名,全类名,以及该类对象,反射获取该类类型,然后.newInstance() 获取该实例
查看全部 -
Class .forName("全类名")
查看全部 -
Class c1=类名.class
Class c2=该类的对象.getClass();
c1==c2
查看全部 -
每一个类都有一个静态成员变量 class ,任何一个类都是 Class 类的实例对象,这个对象也是该类的类类型
查看全部 -
我们创建的任何一个类实际上都是 java.lang.Class 类的实例对象
查看全部 -
静态加载类,在编译的时候就需要给所有类写好,否则,编译不成功;
动态加载类,在运行时,如果没有该类,才运行失败;
另外,可以通过设置接口,来接收不确定的类,通过接口来实现目标类
查看全部
举报