---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
高新技术(2)
1,Beannutils工具包:
我们在操作JavaBean的时候我们可以用Introspector的方式来操作,但是呢这样需要我们写大量的代码。
Apache小组为我们提供了很有用的工具包来操作JavaBean
也就是BeanUtils工具包,这个可以到apache.org上面下载commons-BeanUtils工具包,
同时我们也要下载Logging也就是日志工具包 。
BeanUtils类中的所有方法都是静态方法我们通过它的getProperty setProperty方法 等等方法 这里我们主要用到BeanUtils类
首先我们应该将jar包加入到Eclipse的BuildPath中 然后我们才能使用BeanUtils工具包中的各种类
下面是一个简单的JavaBean
package me.test;
import java.util.Date;
public class BeanTest
{
private intx ;
private Date birthday=newDate() ;
public BeanTest(int x)
{
this.x=x;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
下面是操作
package me.test;
importjava.lang.reflect.InvocationTargetException;
import java.util.*;
importorg.apache.commons.beanutils.BeanUtils;
public class Test
{
publicstatic void main(String []args) throwsIllegalAccessException, InvocationTargetException,NoSuchMethodException
{
BeanTest t=new BeanTest(6) ;
BeanUtils.setProperty(t,"x",7);//设置x属性 ,利用BeanUtils设置值的时候值可以是任意原始类型 也可以是String类型 在web开发中我们用到的都是String类型因为网页间传递的是字串如果我们不想进行字符串转换那个就用PropertyUtils类和 BeanUtils类有着同样的作用只不过PropertyUtils 不进行类型的转换
System.out.println(BeanUtils.getProperty(t,"x")); //返回x属性
BeanUtils.setProperty(t,"birthday.year", "111") ; //这是birthday的year的属性值
System.out.println(BeanUtils.getProperty(t,"birthday.year")); //BeanUtils可以进行级联设置
Mapm=BeanUtils.describe(t); //将JavaBean的各种属性以及值以Map的形式描述
}
}
2,注解:
@SuppressWarnings:压缩警告
通过System.runFinalizersOnExit(true);的编译警告引出
@Deprecated
过时的提示
@Override
重写的注释。
注释相当于一种标记,在程序中加了注释就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,Javac编译器,开发
工具和其他程序可以用反射来了解你的类及各种元素上有无任何种标记,看你有什么标记,就去干相应的事,标记
可以加在包,类,字段,方法,方法的参数以及局部变量上。
看Java.lang包,可以看到JDK中提供的最基本的annotation.
定义一个最简单的注解:public @interface MyAnnotation{}
把它加在某一个类上:@MyAnnotation public class AnnotationTest(){}
用反射进行测试:
if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){
ItcastAnnotationannotation =(ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
System.out.println(annotation);
}
根据反射测试的问题引出@Rectetion元注解的讲解,其三种取值:RetelonPocllcy.SOURCE,
RetelonPocllcy.CLASS,
RetelonPocllcy.RUNTIME
RectetionPocllcy.RUTIME:分别对应的:java源文件-->class文件-->内存中的字节码
Override保留在 :RetelonPocllcy.SOURCE,
SuppressWarnings保留在:RetelonPocllcy.SOURCE
Deprecated保留在:RetelonPocllcy.RUTIME,
@Target元注解:
Target的默认值为任何元素,设置Target等于ElementType.METHOD,原来加在类上的注解就报错了改用数组方式设置@Target({ElementType.METHOD,ElementType.TYPE})就可以了
元注解以及枚举属性值具体查看API文档java.lang.annotation包下面的类。
注解的详细语法可以通过java语言规范了解,即看java的languagespecification。
注解增加的高级属性:
数组类型的属性
int[] arrayAttr() default{1,2,3}
@MyAnnotation(arraAttr = {2,3,4})
如果数组属性中有一个元素,这时候属性值部分可以省略大括号。
枚举类型的属性
Enum Test.TraficLamp();
@MyAnnotation(lamp = EnumTest.TraficLamp.GREEN)
注释类型的属性
MetaAnnotation annotationAttr() default@MetaAnnotation("XXX")
@MyAnnotation(annotationAttr =@MetaAnnotation("YYY"))
可以认为上面这个@MyAnnotation是MyAnnotation类的一个实例对象,同样的道理,可以认为上面这个@MetaAnnotation是MetaAnnotation类的一个实例对象,调用代码如下:
MetaAnnotation =myAnnotation.annotationAttr();
System.out.println(ma.value());
3,泛型:
没有使用泛型时,只要是对象,不管是什么类型的对象,都可以存储进同一个集合中,使用泛型集合,可以将一个
集合中的元素限定为一个特定的类型,集合中只能存储同一个类型的对象,这样更安全,并且当从集合获取一个对
象的类型,不需要对 对象进行强制转换。这样更方便。
了解泛型
ArrayList<E>类定义和ArrayList<Integer>类引用涉及的术语:
整个称ArrayList<E>泛型类
ArrayList<E>中的E称为类型变量或类型参数。
整个ArrayList<Integer>称为参数化的类型
ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数。
ArrayList<Integer>中的<>念着typeof
ArrayList称为原始类型。
参数化类型与原始类型的兼容性:
参数化类型可以引用一个原始类型的对象,编译报告警告,例如,
Collection<String>c = new Vector();//可不可以,不就是编译器一句话的事吗?
原始类型可以引用一个参数化类型的对象,编译报告警告,例如,
Collection c = new Vector<String>();//原来的方法接受一个集合参数,新的类型也要能传进去。
参数化类型不考虑类型参数的继承关系:
Vector<String> v=new Vector<Object>();//错误。
Vector<Object> v=new Vector<String>();//也错误
泛型中的类型参数严格说明集合中装载的数据类型是什么和可以加入什么类型的数据,记住
Collection<String>和Collection<Object>是两个没有转换关系的参数化的类型。
假设:Vector<String>v = newVector<Object>();可以的话,那么以后从V中取出
的对象当作String用,而而V实际指向的对象中可以加入任意类型对象。
假设:Vector<Object>v =newVector<String>();可以的话,那么以后向V中加入
任意类型的对象,而v实际指向集合中只能装String类型的对象。