26.ArrayList_HashSet的比较及Hashcode分析
Collection collections = new HashSet();
// Collection collections = new ArrayList();
ReflectPoint pt1 = new ReflectPoint(3,3);
ReflectPoint pt2 = new ReflectPoint(5,5);
ReflectPoint pt3 = new ReflectPoint(3,3);
collections.add(pt1);
collections.add(pt2);
collections.add(pt3);
collections.add(pt1);
pt1.y=7;
collections.remove(pt1);
System.out.println(collections.size());
}
}
27.框架的概念及用反射技术开发框架的原理
框架与框架要解决的核心问题
我做房子卖给用户住,由用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中。框架与工具类有区别,工具类被用户的类调用,而框架是调用用户提供的类。
框架要解决的核心问题
我在写框架(房子)时,你这个用户可能还在上小学,还不会写程序呢?我写的框架程序怎样才能调用你以后写的类(门窗)呢?
因为在才写程序时无法知道要被调用的类名,所以,在程序中无法直接new某个类的实例对象了,而要用反射方式来做.
28.用类加载器的方式管理资源和配置文件
/*getRealPath();//金山词霸/内部
一定要记住用完整的路径,但完整的路径不是硬编码,而是运算出来的。*/
/*getRealPath();//金山词霸/内部
一定要记住用完整的路径,但完整的路径不是硬编码,而是运算出来的。*/
// InputStream ips = new FileInputStream("config.properties");
InputStream ips = ReflectTest2.class.getClassLoader().getResourceAsStream("src04/config.properties");
// InputStream ips = ReflectTest2.class.getResourceAsStream("config.properties");
Properties props = new Properties();
props.load(ips);
ips.close();
String className = props.getProperty("className");
Collection collections = (Collection)Class.forName(className).newInstance();
29.由内省引出JavaBean的讲解
IntroSpector-->JavaBean-->特殊的Java类
class Person
{
private int x;
public int getAge(){
return x;
}
public void setAge(int age){
this.x = age;
}
}
Age-->如果第二个字母是小的,则把第一个字母变成小的--age
gettime-->time
setTime-->time
getCPU->CPU
30.对JavaBean的简单内省操作
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称为值对象,(Value Object,简称VO).这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,大家觉得这些方法的名称叫什么好呢?JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量.如果方法名为setld,中文意思即为设置id,至于你把它存到哪个变量上,用管吗?如果方法名为getld,中文意思即为获取id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的.
setld()的属性名->id
isLast()的属性名->last
setCPU的属性名是什么?->CPU
getUPS的属性名是什么?->UPS
总之,一个类被当作javaBean使用时,javaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量.
一个符合javaBean特点的类可以当作普通类一样进行使用,但把它当javaBean用肯定要带来一些额外的好处,我们才会去了解和应用JavaBean!好处如下:
在Java EE开发中,经常要使用到JavaBean.很多环境就要求按JavaBean方式进行操作,别人都这么用和要求这么做,那你就没什么选择的余地!
JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省.如果要你自己去通过getx方法来访问私有的x,怎么做,有一定难度吧?用内省这套api操作javaBean比用普通类的方式更方便.
31.对JavaBean的复杂内省操作
BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
Object reVal = null;
for(PropertyDescriptor pd:pds){
if(pd.getName().equals(propertyName))
{
Method methodGetX = pd.getReadMethod();
retVal = methodGetX.invoke(pt1);
break;
}
}
return retVal;
}
}
32.使用BeanUtils工具包操作JavaBean
用eclipse如何假如jar包,先只是引入beanutils包,等程序运行出错后再引入logging包.
在前面内省例子的基础上,用BeanUtils类先get原来设置好的属性,再将其set为一个新值.
get属性时返回的结果为字符串,set属性时可以接受任意类型的对象,通常使用字符串.
用PropertyUtils类先get原来设置好的属性,再将其set为一个新值.
get属性时返回的结果为该属性本来的类型,set属性时只接受该属性本来的类型.
33.了解和入门注解的应用
了解注解及java提供的几个基本注解
先通过@SupperssWarnings的应用让大家直观点地了解注解:
通过System.runFinalizersOnExit(true);的编译警告引出
@SuppressWarnings("deprecation")
@Deprecated
直接在刚才的类中增加一个方法,并加上@Deprecated标注,在另外一个类中调用这个方法.
@Override
public boolean equals(Reflect other)方法与HashSet结合讲解
总结:
注释相当于一种标记,加了注解就等于打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其它程序可以用反射来了解你的类及各种元素上有无任何标记,看你有什么标记,就去干相应的事.标记可以加在包,类,字段,方法,方法的参数以及局部变量上.