内省--了解javaBean 内省 IntroSpector 对JavaBean(一种特殊的Java类)进行操作 Age---如果第二个字母是小的,则把第一个个字母变成小的---age 有一个方法叫gettime---则javaBean有一个熟属性time 一个符合JavaBean特点的类可以当做普通类一样进行使用。采用遍历BeanInfo的所有属性方式来查找和设置某个RefectPoint对象的的x属性。在程序中把一个类当做JavaBean来看,就是调用IntroSpector.getBeanInfo方法,得到的BeanInfo对象封装了把这个类当做JavaBean看的结果信息。 private static void setProperties(Object pt1,String propertName,Object value) throws IntrospectionException, IllegalAccessException,InvocationTargetException{ PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,pt1.getClass()); Method methodSetX=pd2.getWriteMethod(); methodSeX.invoke(pt1,value); } private static Object getProperty(Object1,String properyName) throws IntrospectionException ,IllegalAccessException,InvocationTargetException{ BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass()); PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); Object retVal=null; for(PropertyDescriptor pd : pds){ if(pd.getName().equals(propertyName)) { Method methodGetX = pd.getReadMethod(); retVal = methodGetX.invoke(pt1); break; } } return retVal; } Beanutils 工具包 可以自动进行类型转换 //java7的新特性M Map map = {name:"zxx",age:18}; BeanUtils.setProperty(map,"name","1hm"); BeanUtiles对字符串进行操作 PropertyUtiles.setProperty(pt1,"x","9"); PropertyUtiles以属性本身的类型进行操作 了解注解及java提供的几个基本注解 JDK1.5 的新特性 @SuppressWarnings("deprecation")//使过时方法继续使用 @Deprecated //表示sayHellod方法过时了 public static void sayHello(){ } @Override//检查子类是覆盖父类的方法 注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,有什么标记就去干相应的事。标记可以加载包,类,字段,方法,方法的参数以及局部变量上。 注解的应用结构对“应用了注解类的类”进行反射操作的类----应用了“注解类”的类--注解类注解的生命周期: java源文件--class文件--内存中的字节码 为注解增加属性 @ItcastAnnotation(color="red",value="abec"); 注解属性可以是原始类型,字符串类型,.class类型,数组类型 体验泛型 JDK1.5的新特性 ArrayList类定义和ArrayList类引用中涉及如下术语:整个称为ArrayList泛型类 ArrayList中的E称为类型变量或类型参数整个ArrayList称为参数化变量或类型参数 ArrayList中的Integer称为类型参数的实例或实际类型参数 ArrayList中的<>表示typeof ArrayList称为原始类参数化类型与原始类型的兼容性: 参数化类型可以引用一个原始类型的对象 原始类型可以引用一个参数化类型的对象 泛型中的?通配符 Collection 集合类使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。 泛型中的?通配符的扩展限定通配符的上边界 Vector
x = new Vector(); 限定通配符的下边界:正确 Vector
x = new Vector(); 限定通配符总是包括自己。 泛型集合类的综合案例 Java的集合类主要分为两大类,即Collection类型的集合和Map类型的集合,这两类集合的内部存储结构区别: 1.Collection类型的集合是单列的,其中增加的每个元素都为一个单独的对象。 2.Map类型的集合是双列的,其中增加的每个元素都包含两个对象,一个是作用键,另外一个用作值,即Map类型的集合中的每个元素为一个键对象和值对象的组合体。 HashMaphm = new HashMap(); hm.put("zxx",19); hm.put("list",18); Se>mes = hm.entrySet(); for(Map.Entryme: mes){ System.out.println(me.getKey()+":"+me.getValue); } 由C++的模板函数引入自定义泛型 add(3,5) Number x1 = add(3.5,3) Object x2 = add(3,"abc") private static T add(T x,T y){ //任意类型T return null; } 交换数组中两个元素的位置 swap(new String[]){"abc","xyz","itcast",1,2} swap(new int[]{1,3,5,4,}) 编写一个方法,自动将Object类型的对象转换成其他类型 String x3 = autoConvert(obj); private static T autoCovert(Object obj){ return(T)obj; } 定义一个方法可以将任意类型的数组中的所有元素填充为相应类型的某个对象 private static fillArray(T[] a,T obj){ for(int i=0;i void printCollection2(Collection collection){ System.out.println(collection.size()); for(Object obj: collection){ System.out.println(obj); } } } 定义一个方法,把任意参数类型的集合中的数据安全地复制到相应类型的数组中 staticvoid copy(Collectiona,T[]pu 定义泛型类型数据库操作 crud 增删 改藏 public class GenericDao{ public void add(T x){ } public Person findById(int id){ return null; } public void delete(T obj){ } public void update(E obj){ } public Set findByconditons(String where){ return null; } } 泛型类型为类 通过反射获得泛型的实际类型参数 Vector v1 = new Vector(); v1.getClass(). Method applyMethod = GenericTest.class.getMothed("applyVector",Vector.class); public static void applyVector(Vector v1){ } 类加载器加载类的工具 Java虚拟机种可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类 BootStrap,ExClassLoader,AppClassLoader public static void main(String[] args){ System.out.println{ ClassLoaderTest.CLass.getClassLoader().getClass().getName(); } System.out.println{ System.class.getClassLoader(); } ClassLoader loader = ClassLoaderTest.class.getClassLoader(); whlie(loader! = null) { System.out.println(loader.getClass.getName()); loader = loader.getParent(); } } } 类加载器之间的父子关系和管辖范围 类加载器的委托机制 编写一个类加载器父类--loadClass/findClass/得到class文件的转换橙子姐子类1()子类2() public class MyClassLoader{ public static void main(String[] args){ String srcPath=arg[0]; String destDir = args[1]; FileInputStream fis = new FileInputStream(srcPath); String destFileName = srcPath.substring(srcPath.lastIndexOf('//')+1); String destPath = destDir +"//"+ destFieName; FileOutputStream fos = new FileOutputStream(destPath); cypher(fis,fos); fis.close(); fos.close(); } private static void cypher (InputStream ips, OutputStream ops) throw Exception{ int b = -1; while(b = ips.read()) !=-1){ ops.write(b^Oxff); } } } 代理的概念与作用程序中的代理要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如异常处理、日志、计算方法的运行时间、事物管理、等等 代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码 代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以在代理方法中的如下四个位置加上系统功能代码: 1.在调用目标方法之前 2.在调用目标方法之后 3.在调用目标方法前后 4.在处理目标方法异常的catch块中 class X { void sayHello(){ syso:hello,itcase } XProxy { void sayHello(){ starttime X.sayHello(); endtime } 猜想分析动态生成的类的内部代码 动态代理的工作原理图 分析动态代理的类称为目标类传进去直接在InvocationHandler实现类中创建目标类的实例对象,可以看运行效果和加入日志代码,但没有实际意义为InvocationHandler实现类注入目标类的实例对象,不能采用匿名内部类的形式让匿名的InvocationHandler实现类访问外面方法中的目标类实例对象的final类型的引用变量。 交通灯管理系统没有学不会的技术,用最短的时间 项目需求模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆信号灯忽略黄灯,只考虑红灯和绿灯。应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。每辆车通过路口时间为1秒随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果 有哪些对象:红绿灯,红绿灯的控制系统,汽车,路。路中存储着车辆的集合,显然路上就应该有增加车辆和减少车辆的方法。 谁拥有数据,谁就对外提供操作这些数据的方法。 人在黑板上画圆 person,blackboard,circle draw(){ x,y--radius } public enum Lamep{ S2N("N2S",false,"S2W")