内存泄露
动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。
当一个对象存储进hashset集合后,就不能修改这个对象中那些参与计算哈希值的字段了,否者会导致内存泄露,影响程序执行。
框架的概念
在配置文件中可指定不同集合种类,然后加载配置文件:
Collection collections = (Collection)Class.forName(配置文件字串).newInstance(),
从而使先开发的框架调用后开发的程序。
配置文件一定要用完整的路径,但完整的路径不是硬编码,而是运算出来的
类加载器加载配置文件,这种方式只能读
InputStream ips = 类名.class.getClassLoader().getResourceAsStream("cn/itcast/day1/config.properties")
cn/itcast/day1/config.properties是源文件夹到配置文件的路径
相对路径加载
InputStream ips = 类名.class.getResourceAsStream("相对于子包的路径");
绝对路径加载
InputStream ips = 类名.class.getResourceAsStream("(绝对)相对于根的路径(/cn/.....)");
内省IntroSpector------>JavaBean一种特殊的Java类
写一个JavaBean叫Person具有...属性
class Person
{
private int x;
public int getAge(){return x;}
public void setAge(int age){this.x=age;}
}
JavaBean叫Person具有age属性
去掉get和set后剩下的就是JavaBean的属性名
Age--->如果第二个字母是小的,则把第一个字母变成小的--->age
gettime--->time
setTime--->time
getCPU--->CPU
内省
PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());
//PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性。
Method methodGetX = pd.getReadMethod();//获得读的方法,即get方法
Object retVal = methodGetX.invoke(pt1);//pt1是JavaBean实例化的对象
System.out.println(retVal);//属性的值
重构抽取方法
对JavaBean的属性进行设置可以使用BeanUtils工具包来设置和读取JavaBean的属性
注解
jdk1.5新特性枚举,注解
一个注解是一个类
使用注解就等于调用该类
@Override注解覆盖-----源文件
@Deprecated注解过时代码------源文件
@SuppressWarnings("deprecation")压缩警告过时代码跳过警告----
注解相当于一种标记,在程序上加上注解就等于为程序加上某种标记。
Javac编译器,开发工具和其他程序可以了解你的类和各种元素上有无何种标记,
有什么标记就做什么事,标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
注解类@interface A{}
应用了注解的类
@A
Class B{}
对应用了注解的类进行反射操作的类
Class C
{
B.class.isAnnotionPresent(A.class);
A a = B.class.get.Annotion(A.class);
}
元注解:对注解类的注解
注解生命周期
源文件--->class文件--->内存中的字节码
默认Class文件阶段
@Retention(RetentionPolicy.RUNTIME)
让注解生命到内存运行阶段
编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。
@target(ElementType.)
指定注解加在什么地方上的元注解
为注解增加属性
数组类型的属性
int[] arrayAttr() default{1,2,3};
@MyAnnotation(arrayAttr={2,4,3})
如果数组属性中只有一个元素,这时属性值部分可以省略
枚举类型属性
EnunTest.TrafficLamp lamp();
@MyAnnotiation(lamp=EnumTest.TrafficLamp.GREEN)
注释类型属性
MetaAnnotation annotationAttr() default@MetaAnnotation("xxx")
@MyAnnotation(annotationAtt=@MetaAnnotation("yyy"))