📄 day07.txt
字号:
CoreJava(day07) 2007-12-11 --- 李艳
反射:
简介:struts,Hibernate,spring这三种框架统称为ssh,这三种框架都是用.xml作配置文件的,利用的就是反射机制。
反射有用,但我们用反射的机会不多,因为大部分用到反射的时候别人都已经写好了。
反射的作用:java 1.4以前反射是不被推举技术,因为当时性能差。
从1.4开始sun公司把反射的机制作了很大的优化,性能上不再有问题,从此反射成为程序员可用的武器。
反射的应用:平时不写反射,当想动态的生成执行代码时就会用到反射。
动态生成代码:类,对象,方法
我们的要求:能够做到动态生成对象,动态调用方法
用的最多的类的反射
class(类)是抽象、概念上的定义。object(对象)是个体、实例化。
java.lang.Class(类): 是Object的子类。Class是一个类。对应类里的所有信息。
用反射的眼光看String类:1、class---API信息(是一个对象) 2、object-----可以调用任意方法(是一个对象)
每一个类都含有两个对象(class对象,object对象)
int(对象)--->class(封装类) 封装类.TYPE-------例 Integer.TYPE
当getXXX时,取得的所有都是public(允许继承),private不行。
例: public Field[] getFields()throws SecurityException
方法名加Declared的就会把private的和public的都取到
需要记的方法:1、class--->public static Class<?> forName(String className) throws ClassNotFoundException
2、get系列:可以取属性、方法、构造器、父类、修饰符
取方法的:public Field getDeclaredField(String name) throws NoSuchFieldException,SecurityException
public Field[] getDeclaredFields() throws SecurityException
只获得public的属性
3、newInstnce()(类对象调用,调用无参的构造器)---->类对象---->普通对象,若没有无参构造器就会出错。
常用的:
java.lang.reflect.Field(属性):
public Class<?> getType() 不管是否是private的
java.lang.reflect.Method(方法):
public Object invoke(Object obj,Object... args)throws IllegalAccessException,IllegalArgumentException,InvocationTargetException
java.lang.reflect.Constructor(构造器):
public T newInstance(Object... initargs)throws InstantiationException,IllegalAccessException,IllegalArgumentException,InvocationTargetException
基本不用:java.lang.reflect.Array(数组):
获得类对象(class)的三种途径:(课堂代码:TestClass.java)
1、Class c1=Class.forName(“java.lang.Integer”) //输入全类名,包名、类名都要有,即使import了也不能少包名
2、String s1="abc";
Class c2=s1.getClass(); //所有先有对象的都可以getClass();
3、Class c3=Integer.TYPE; //所有简单类型对应类对象只有一个
获得属性会破坏封装:(课堂代码:TestField.java,Person.java)
获得构造器:(课堂代码:TestCon.java,Person.java)
如何动态的构造对象:(课堂代码:UseCon.java,Person.java)
先要选定构造器,再创建实例
获得方法:(课堂代码:TestMethod.java,Person.java)
public Method[] getDeclaredMethods()throws SecurityException
public Method[] getMethods() throws SecurityException
public Method getMethod(String name,Class... parameterTypes)throws NoSuchMethodException,SecurityException
Class...是5.0的新特性,也可以传数组的。1.4及以前都必须传数组的。
动态调用方法:(课堂代码:UseMethod.java,Person.java)
public Object invoke(Object obj, Object... args)throws IllegalAccessException,IllegalArgumentException,InvocationTargetException
练习动态生成代码:(课堂代码:TestAuto.java,Person.java)
for(String s:set){} //5.0新特性,可以从所有集合中取
对象---->String 包名、类名,Object o没有所有属性
|
|
|
对象set方法
|
|
c.getMethod(方法名.class)
总结反射的编程步骤:
1、利用String---->class class.forName(String);
2、class----->其它
|必
|须
|无
|参
|构
|造
|
实例化对象
3、其它---->传参---->调用
内部类:
不推崇使用内部类
内部类的好处:可以直接操作私有属性。
封装类:
class1{
class2{} //内部类
}
内部类的分类:
成员式:
静态内部类: (课堂代码:StaticInner.java ,TestStaticInner.java) 生成的内部类的字节码文件StaticInner$Inner1.class
在静态内部类中只能访问外部类的静态成员。构造静态内部类对象不再需要构造外部类对象
成员内部类:(课堂代码:MemberInner.java ,TestMemberInner.java)
必须要先构造外部类对象,再根据外部类对象构造内部类对象。
生成成员内部类对象形式: Inner2 i2=new MemberInner().new Inner2();
一个外部类对象可以生成多个成员内部类对象,一个成员内部类对象一定是由某一个外部类对象生成的。
成员内部类不能有静态属性
内部类和外部类的实例变量可以共存。
在内部类中访问实例变量:this.属性
在内部类访问外部类的实例变量:外部类名.this.属性。
在外部访问时,外部类.内部类作声明,new 外部类(得到外部类对象).new 内部类(得到内部类对象)
例:MemberInner.Inner2 i2=new MemberInner().new Inner2();
局部式:
局部内部类:定义在外部类的方法中。(课堂代码:MemberInner.java)
与局部变量类似,在局部内部类前只能用abstract或final修饰符,但一般不加此修饰符,避免对继承产生影响。其范围为定义它的代码块。
局部内部类不仅可以访问外部类实例变量,还可以访问外部类的局部常量,但是要求外部类的局部变量是final的。
实际上是为内部类添加了一个属性,这个属性就是外部类的final局部变量
在类外不可直接访问局部内部类(保证局部内部类对外是不可见的)。
在方法中才能调用其局部内部类。
匿名内部类: 特殊的局部内部类,用来继承一个类或者实现一个接口,我们只需要这个局部内部类的一个对象。
匿名内部类不能定义构造方法
匿名内部类在编译的时候由系统自动起名Out$1.class。
如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。
因为匿名内部类无构造方法,所以其使用范围非常的有限。
复习前6章
封装:private 属性
public 方法
构造器调方法
继承:复用代码方式
必须子类是什么父类
共享代码,维护简单
子 父
继承
类 -----------类(单个)
extends
实现
类------------接口(多个)
implements
多继承
接口----------接口(多个)
extends
多态:同一种东西具备多种形态
1、简单多态:比如:7可以当成int,double,byte都可以
2、方法多态:重写(覆盖)、重载
3、参数多态(重要):依赖于简单多态和类多态,在传参的时候可以传出n种类的参数
4、类多态(接口):Set set=new HashSet();
几种实用类:
Object:equals,hashCode,toString,clone
String(不可改变的字符序列)
StringBuffer
StringBuilder
集合:Set,List,Map
反射:Class,Field,Method,Constructor
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -