------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
内省(IntroSpector)
用于对javaBean操作。意思是检查、体检,即对程序内部进行检查。
JavaBean
1、JavaBean是一种特殊的Java类,主要用于传递数据信息,访问私有的字段,并且方法符合某种特殊的命名规则。
2、只要一个类中含有get、is或set打头的方法就可以当做JavaBean使用。
3、JavaBean的字段就是我们定义的一些成员变量。
4、JavaBean的属性是根据其中的setter和getter确定的。去掉set或get剩余部分就是属性名称。如果剩余部分第二个字母小写,则第一个也小写。
5、一个类被当做JavaBean使用时,JavaBean属性是根据方法 推断出来的,看不到内部的成员变量
作用:
如果在两个模板之间传递多个信息,可将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(VO)。这些信息在类中用私有字段来存储。如果读取或设置这些字段的值,用方法访问。
好处:
1、在Java EE开发中,经常使用JavaBean。环境要求
2、JDK中提供了对JavaBean进行操作的API,这套API称为内省,若要通过getX的方式来访问私有x,可用内省这套API操作JavaBean要方便
例子:
要抽取方法可直接右键。
对JavaBean的复杂内省操作
1、IntroSpector类中有getBeanInfo(Class cls)的方法,通过此方法获取BeanInfo实例。参数是对象字节码
2、BeanInfo类中有getPropertyDescriptors()的方法,可获取所有JavaBean类中的属性信息,返回是PropertyDescriptor[]
3、遍历的形式,获取属性信息。
BeanUtils工具包
BeanUtils是由阿帕奇提供便于开发的工具包。BeanUtils可以将8种基本数据类型进行自动转换,对于非基本数据类型,需要注册转换器Converter,就需要ConverUtils包
好处:
1、提供的set或get方法中,传入是字符串,返回也是字符串,这个工具包内部有自动将整数转换为字符串的操作。
2、支持属性的级联操作,即支持属性链。
3、可以和Map集合进行互换:可以将属性信息通过键值对的形式作为Map集合存储(通过static java.util.Mapdescribe(java.lang.Object bean)方法)。也能将Map集合转换为JavaBean中 的属性信息(通过static void populate(java.lang.Objectbdan,java.util.Map properties)的方法)。
注解(annotation)
是JDK1.5的新特性,相当于一种标记,在程序中加了注解就等于为程序打上了标记。javac编译器、开发工具和其他程序可以用反射来了解你的类及各种元素上有无和何种标记,判断去干相应的事。一个注解就是一个类。
标记添加的位置:
包、类、字段、方法、方法的参数和局部变量上。
注解格式:
@注解类名
如果很只有一个value名称的属性或其他属性缺省,则可@注解名(“属性值”);
有多个或不缺省或者需重新赋值。则@注解名(属性名=“属性值”,……);
三种最基本的注解
1、@SuppressWarning(“deprecation”):表示压制过时警告,就是对过时的不要警告,“deprecation”是警告信息
2、@Deprecated:表示告知调用者,该成员函数、字段等已经过时,不在使用。编译器会提示警告信息
3、@Override:表示下面的方法是在覆盖(父类方法),如果没覆盖,机会报错。
自定义注解和应用:
自定义格式:
@interface名称{statement}
元注解:
在定义注解的时候加注解。有两个常用于元注解的注解:Retention和Target
Retention:用于说明注解保留到哪个阶段
枚举类Retention类的值:
RetentionPolicy.SOURSE:java源文件时期。
RetentionPolicy.CLASS:class文件时期(默认时期)。
RetentionPolicy.RUNTIME:运行时期。
注:
1.当在源程序上加了注解,javac和java源程序编译为Class文件时,会对注解的生命周期进行判断。然后处理
2.class文件中不是字节码,只有把class文件中的内容加载进内存,用类加载器加载处理后(进行完整的检查等处理),最终得到的二进制内容才是字节码。
Target:用于说明使用范围。默认在任何地方。
枚举值为:PZCKAGE包声明、ANNOTATION_TYPE注释类型声明、CONSIRUCTOR构造器声明、METHOD方法声明、PARAMETER参数声明、TYPE类、接口(包含注释类型)或枚举声明、LOCAL_VARIABLE局部变量声明。
注解的应用:
1.定义注解类:@interfaceA{}
2.应用了“注释I类”的类
3.对“应用注解类 的类”进行反射操作的类。
例子:
为注解添加基本属性
定义格式:
和接口一样:String color();
缺省格式:String value() default “haah”;
应用:直接在注解的括号了里
1、当只有一个属性时,可以省略键
2、可以指定缺省,使用时可以再设置属性。
3、反射获得注解对象,可用对象调用属性对应的方法获取属性值
为注解增加其他属性:
返回值类型:
1.8种基本类型2.String类型3.Class类型4.枚举类型5.注解类型6.前面的数组
类加载器
定义:加载类的工具
作用:将Class文件中的内容变为字节码加载进内存。
默认类加载器:
1.JVM可安装多个类加载器,系统默认有三个主要的:BootStrap、ExtClassLoader、AppClassLoader
2.类加载器本身也是java类,但是BootStrap不是java类,所以最开始是由它加载的。它嵌套在JVM内核中是c++写得,不能通过java获取名字,返回值一定为空
类加载器采用树形结构组织,实例化类加载器对象需要为其指定一个父级类加载器对象或用系统安装的为父级类加载器
例子:
类加载的委托机制
每个类加载器只能加载特定位置和目录中的类,但它们可以委托其他的类加载器加载,这就是类的委托模式。
加载类的方式
1.首先当前的线程的类加载器去加载线程中的第一个类。
2.A引用了B,JVM将使用A的加载器加载B
3.可以直接用ClassLoader的LoadClass()加载
加载顺序:
最初发起的类加载器无法加载会委托上级加载器,逐级上找,直到Bootstrap,如果还未加载到,则会逐级返回直到最初的发起加载器,然后抛出ClassNotFoundException。停止查找,并不会调用子类加载器。
委托机制优点:
可以集中管理,不会产生多字节码重复的情况
例子
自定义类加载器
1.必须继承抽象类ClassLoader,并复写findClass(String name),不能复写loadClass()。
2复写findClass(String name)的原因:
由于在LoadClass()内是先委托给父级,当父级找不到后再调用findClass(String name),也就是自定义的类加载器,所以只需要复写findClass(),就能实现用西定义的类加载器加载类的目的。一般自定义类加载器会把需要加载的类放指定目录中。java已有的加载器是不知道的,所以不会找。这样才会调用findClass(),用自定义的加载器加载指定的目录。这是模板方法设计模式,保留了loadClass()方法中的流程,只需要实现局部细节就行了。
编程步骤:
1.编写一个对文件内容进行简单加密的程序。
2.写一个自己的类加载器,可实现对加密的类进行加载和解密。
3.写一个程序,调用类加载器加载类。在源程序中不能用该类名定义引用变量,因为编译器无法识别这个类,程序中除了可使用ClassLoader的loadClass方法外,还可以使用设置线程的上下文类加载器或系统类加载器,然后再使用Class.forName。