java基础高新技术博客_第1页
java基础高新技术博客_第2页
java基础高新技术博客_第3页
java基础高新技术博客_第4页
java基础高新技术博客_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序员JAVAJAVA学习笔记2013-07-0216:39153(0收藏------------androidjavajava什么是Eclipse是一个开放源代码的、基于Java的可扩展开发平台。开发环境。幸运的是,Eclipse附带了一个标准的插件集,包括开发工具(JavaDevelopmentMyEclipse关系:Eclipse是一个IDE(IntegratedDeveloEnvironment),而这个IDE是允许安装第开发的插件来使自身的功能得到扩展和增强的Myeclipse是其中的一种有名的插件集之一,MyEclipse将开发者常用到的一些有用的插件都集Workspace一个workspace以包含多个project,一个workspace留了eclipse一套环境配置,例如,所使用的javacjava令,等等,细节请查看window->preferences。如果要eclipse再配置一套环境选项,可以再创建workspace。Packageexplorer图窗口中的filters单项,可以显示空的父包(此功能是默认关闭的)。javac选择工程,右键->properties以设置javac,右键->runasopenrundialog以设置java。先用新的工作间,然后创建新工程,默认的语言即为5.0。先使用Integer x=3;调整编译器的语法版本为1.4,看到eclipse窗口报错了。然后将这个工程的语言设6.0,马上又看到badversion.class行错误了,这是因为myeclise带的java1.5然后再将整个工作间的javac设置为6.0(eclipse自带的是jdk1.5),然后看新建工程的javac,也随之改成了6.0,运行则又报badversion.class误。将工程的编译语言再单独5.0,运行则没了问题。整个工作间的语言设6.0再将整个工作间的java设置为自己安装的java6快捷键的位置:General->keys,设置alt+/键(丁a会搜索出)进行内容提示时,要注意解除alt+/键原来的绑定关系,直接输入alt+/就可以找到它的绑定关系,删除绑定关系时也可以使用removebinding个按钮。在eclipse中。代码模板的设置位置:javaimport语句可以导入一个类或某个包中的所importstatic语句导入一个类中的某个静态方法或所有静方如importstaticjava.lang.Math.sin;importstaticjava.lang.Math.*;需要注意,静态导入是JDK1.5出现的新特性,在写代码的要注意javac本一个方法接受的参数个数不固定,例如System.out.println(countScore(1,2,3,5))可变参数就非常方便。可变参数的特点只能出现在参数列表 位于变量类型和变量名之间,前后有无空格都可3.数组,在方法体中以数组的形式可变参数。代码示例[java]view 1.1.publicstaticvoidmain(String[]5.7.publicstaticintadd(intx,intintsum={}15.returnsum+=for(int8.2.for语法:for(type量名:集合注意事项迭代变量必中定义集合变量可以是数组或实现了Iterable接口的集合类(很多代码示例[java]view 1.1.publicstaticintadd(intx,intintsum={}9.returnsum+=for(int2.自动装箱:Integernum112;//将基本数据类型自动转化为自动拆箱:System.out.println(num1+12);//将数据类型的num1动转化为基本数据类型进行运算基本数据类型的对象缓Integernum1=Integernum2 这块相等,<=127都是真System.out.println(num1==Integernum3 这不相等,因为是对Integernum4=129;System.out.println(num3==num4);//falseIntegernum5=Integernum6 这块的道理上System.out.println(num5==

为什么要有枚举问题:要定义星期几或的变量,该怎么定义?假设用1-分别表示星期一到星期日,但有人可能会写成intweekday0;或即一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的值,普通变量的方式在开发阶段无法实现这一目标。用普通类实现枚举功能,定义一个Weekday的类来模拟枚举能私有的构造方每个元素分别用一个公有的静态成员变量可以有若干公有方法或抽象方法,采用抽象方法定义就将大量的if.else语句转移成了一个个独立的类代码实现[java]view 1. classWeekDay1 private publicfinalstaticWeekDay1SUN publicWeekDay1nextDay() //TODOAuto-generatedmethod return publicfinalstaticWeekDay1MON=new publicWeekDay1nextDay() //TODOAuto-generatedmethod return WeekDay125./*publicWeekDay if(this== return return 32. publicString return 36.36.基本应利用枚举定义常见的几个方法|--->Stringname():返回此枚举常量的名称,在其枚举中对其进行。|--->intordinal():返回枚举常量的序数(它在枚举中|--->StringtoString():返回枚举常量的名称,它包含在明中|--->static<TextendsEnum<T>>TenumType,Stringname):返回带指定名称的指定枚举类型的枚举常象,例如可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。通方法和抽象方法。要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。方法

带构造方法的枚构造方法必须定义成私有枚举元素MON和MON()的效果一样,都是调用默认的构带方法的枚定义枚举实现普通的next方实现抽象的next方法:每个元素分别是由枚举类的子类生成的实例对象,这些子类采用类似内部类的方式进行定义增加上表示时间的构造方枚举只有一个成员时,就可以作为一种单例的实现方代码实现[java]view importpublicclassEnumTest{publicstaticvoidmain(String[]args)//TODOAuto-generatedmethodstubWeekDayweekDay2= publicenumWeekDay{privateprivateWeekDay(int publicenumpublicTrafficLampreturn publicTrafficLampreturn publicTrafficLamp return TrafficLamp privateint privateTrafficLamp(inttime){this.time= 48.本节学习了几个jdk1.5最后,还需要注意的是Integer装箱的时候数值大于127单例的实现方式。程序员JAVAJAVA学习笔记2013-07-0611:26205(0收藏------------androidjavajavaClass类(反射的基石Java程序在运行时,系统一直对所有的对象进行所谓的运行时类型标识。这项信息了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class封装一个对象和接口运行时的状态,当装载类时,Class虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class象。运行程序时,Java拟机(JVM)首先检查是否所要加载的类对应的Class象是否已经加载。如果没有加载,JVM会根据类名查找.class并将其Class对象载入。基本的Java类型(boolean、byte、char、short、int、long、float和double)和关键字void也都对应一个Class对象。每个数组属于被映射为Class对象的一个类,所有具有相同元素类型和维数的数组都共享该Class象一般某个类的Class对象被载入内存,它就用来创建这个类的各个字节码对应的实例对象(Class类型)获取方法类名.class,例如对象.getClass(),例如,newDate().getClass();九个预定义Class对基本的Java类型(boolean、byte、char、short、int、longfloatdouble)和关键字void,每一个都对应一个Class对涉及到的方法:isPrimitive():判定指定的Class对象是否表包装类型各有各的常量代表其基本类型,如:int.class判定是否为数组类型的Class实例对象:Class.isArray()(如代码示例[java]view 1.1.String3.//获取str17.Class9.//返回与带有给定字符串名的类或接口相关联的Class对11.10.Class6.//获取String的字节码文4.Class12.15.17.判断int是不是基本类型18.20.判断int和Integer两个类的字节码是否相同21.System.out.println(int.class==23.TYPE表示基本类型int的Class实例。24.System.out.println(int.class==26.数组不是基本类型27.30.反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java中用一个Class对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,表示java类的Class类显然要提供一系列的方法,来获得其中的变量,对象来表示,它们是Field(成员字段)、Method(方法)、反射是java中的一种运行机制,是在运行状态中对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为java语反射作用在运行时判定任意一个类所具有的成员变量和方法在运行时构造任意一个类的对象在运行时判定任意一个对象所属的类在运行时调用任意一个对象的方法生成动态Constructor[]constructors=得到某一个构造方法Constructorconstructor=创建实例对通常方式:StringstrnewString(new反射方式:Stringstr=(String)constructor.newInstance(newStringBuffer("abc"));//调Class.newInstance()方法:Stringobj=实例对象。存默认构造方法的实例对象。代码示例[java]view 5.Stringstr2=(String)constructor1.newInstance(new4.//再用Constructor类中的newInstance5.Stringstr2=(String)constructor1.newInstance(new4.//再用Constructor类中的newInstance方法给构造方法实例化2.Constructorconstructor1=8.8.FiledField类代表某个类中的一个成员变[java]view 1.1.//成员变量的反3.//5. 反射FieldfieldX=//调用逆转方法4.FieldfiledY=2.ReflectPointpt1=newReflectPoint(3,练习:将任意一个对象中的所有String类型的成员变量所对应的字符[java]view 1.importpublicstaticvoidmain(String[]args)throwsException}privatestaticvoidchangeStringValue(Objectobj)throws[]for(FieldReflectPointpt1=new2.publicclassReflectest StringoldValue=(String)field.get(obj);//获取obj的String类型的 StringnewValue=oldValue.replace('ba');//将b换成 field.set(obj,newValue);//将 21.22.classReflectPoint publicString publicString publicStringstr3=" //重写toString方 publicString returnstr1+""+str2+" 30.MethodMethod代表某个类中的一个成员方法得到类中的某一个方法:MethodcharAt调用方法通常方式如果传递给Method对象的invoke()方法的第一个数为null,这有着什么样的意义呢?说明该Method对象对应的是一个jdk1.4jdk1.5invoke的区别jdk1.5:publicObjectinvoke(Objectobj,Object...args)(可变参数)jdk1.4:publicObjectinvoke(Objectobj,Object[]args),即按jdk1.4法,需要将一个数组作为参数传递给invoke方法时,数组中的每个元素分别对应被调用方法中的一个参数,所以,调用charAt的代码也可以用Jdk1.4charAt.invoke(“str”,newObject[]{1})形式。用反射的方式执行某个类的main方首先要明白,为什么要用反射调用一个类中的main方法?答:在程序的运行过,用户可能会指定调用哪个类mainmain调用那个类的main方法。启动Java程序的main方法的参数是一个字符串数组,publicstaticvoidmain(String[]args),通过反射方式来调用这个main方法时,如何为invoke方法传递参数呢?按jdk1.5的语法,整个数组是一个参数,而按jdk1.4法,数组中的每个元素对应一个参数,当把一个字符串数组作为参数传递给invoke法时,javac会到底按照哪种语法进行处理呢?jdk1.5肯定要兼容jdk1.4语法,会按jdk1.4语法进行处理,即把数组打散成为若干个单独的参数。所以,在给main传递参数时,不能使用代码mainMethod.invoke(null,newString[]{“xxx”}),javac它当作jdk1.4语法进行理解,而不把它jdk1.5语法解释,因此解决办法mainMethod.invoke(null,newObject[]{newString[]{"xxx"});译器会作特殊处理,编译时不把参数当作数组的Class实例对象(此处比较与值无关)。代表数组的Class实例对象的getSuperClass()方法返回的父类为Object对应的Class。基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。代码示例[java]view 1.1.int[]a1=[]a2=[][]a3=new7.String[]a4=new9.15.{}}{}System.out.println(Array.get(obj,for(intintlen={ 14.privatestaticvoidprintObject(Object2.32.框我做房子卖给用户住,由用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中。框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类框架要解决的问我在写框架(房子)写程序呢?我写的框架程序怎样能调用到你以后写的类(门窗)呢?因为在写才程序时无法知道要被调用的类名,所以,在程序中无法直接new某个类的实例对象了,而要用反射方式来做。示例代码[java]view 1.1.package3.import5.import7.import9.publicclassReflectTest2publicstaticvoidmain(String[]args)throwsInputStreamis=Propertiesprop=new{8.import6.import4.import StringclassNameprop.getProperty("className");// Collection ConstrucPointcons1=new ConstrucPointcons2=new ConstrucPointcons3=new 37.反射给我们带来了不少的好处,在程序的运行过直接可以利用这些进行自己想要的操作,特别要的就是反射有一个实现框程序员JAVAJAVA学习笔记2013-07-2401:03268(0收藏------------androidjavajavaJavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于私有的字段,且方法名符合某种命名一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(ValueObject,简称VO)。这些信息在类中用私有字段来,如果或设置这些字段的值,则需要通过一些相应的方法来,大家觉得这些方法的名称叫什么好呢?JavaBean属性是根据其中的settergetter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为id,至于你把它存到哪个变量上,用管吗?如果方法名为getId,中文意思即为获取id,至于你从哪个变量上取,用管吗set缀,剩余部分就是属性名,如果剩余如setId()的属性名idisLast()的属性名lastsetCPU属性名是什么?CPUgetUPS属性名是什么?总之,一个类被当作javaBean用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java内部的成员变量。一个符合JavaBean的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处,我们才会去了解和应用JavaBean!好处如下:在JavaEE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作,别人都这么用和要求这么做,那你就没什JDK中提供JavaBean进行操作的一些API,这套API为内省。如果要你自己去通过getX方法来私有的x,怎么做,有一定难度吧?用内省这套api操作JavaBean比用普通类的方式更方便代码示例[java]view 1.1.ReflectPointpt1newReflectPiont(5,5);//JavaBean3.StringpropertyNamex";//5.//新建一个PropertyDescriptor类的实例,将指定属性与的指定类的Class6.PropertyDescriptorpd=new8.MethodmethodGetXpd.getReadMethod();//得到里面getX()方9.ObjectretValmethodGetX.invoke(pt1);//调用上面获取到的方12.MethodmethodSetXpd.getWriteMethod();//得到里面setX()方稍等复杂点的方法[java]view 1.1.BeanInfobeanInfoIntrospector.getBeanInfo(pt1.getClass());//ObjectretVal=for(PropertyDescriptorpdpds)//遍{{MethodmethodGetXpd.getReadMethod();//得到成员变量的get方retValmethodGetX.invoke(pt1);//调用方}13.return12.2.PropertyDescriptorpdsbeanInfo.getPropertyDescriptors();//得到里面所有的Beanutils包是由apache发,方便JavaBean行一些操作,在使用Beanutils具包的时候,记得导入loggingBeanUtils.setProperty(pt1,"x","9");set里的X是int但是我们用Beanutils置值的时候是用String型设置进去的,返回String型的。PropertiesUtils类PropertiesUtils以属性本身的类型进行操作。代码示例[java]view 2.System.out.println(BeanUtils.getProperty(npropertyName));//属性是型1.//2.System.out.println(BeanUtils.getProperty(npropertyName));//属性是型3.BeanUtils.setProperty(n,propertyName11");//设置属性4.4.BeanUtils.setProperty(n,"birthday.time","111");//对象n里面有个birthday对象,birthday对象有time属性6.System.out.println(BeanUtils.getProperty(nbirthday.time"));//获取属6.System.out.println(BeanUtils.getProperty(nbirthday.time"));//获取属性8.8.//PropertyUtils以属性本身类型对JavaBean9.PropertyUtils.setProperty(npropertyName,9);//设置的属性值是int型,10.10.

Annotation(注解)是JDK1.5及以后版本引入的。它可以用创建文档,代码中的依赖性,甚至执行基本编时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可通过反射机制编程实现对这些元数据(用来描述数据的数据)的。者它也能在class文件中出现某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工法,方法的参数以及局部变量上。(JDK1.5特性)@Deprecated:已过用@Deprecated用这样的元素,通常是因为它很或存在更好的选择。在使用不告。@Override:复写父类方表示一个方法打算重写超类中的另一个方法。生成一条错误消息@SuppressWarnings:压缩警指示应该在注释元素(有程序元素)中取消显示指定的编译器警告。如果要在特定的方法中取消显示某个警告,则应该注释该方法而不是注释它的类。表示该注解用于什么地方,可ElemenetType包括ElemenetType.CONSTRUCTOR构造器ElemenetType.FIELD域(包括enum实例ElemenetType.LOCAL_VARIABLE局部变量ElemenetType.METHOD方法2013/5/12ElemenetType.PACKAGE包ElemenetType.PARAMETER参数ElemenetType.TYPE类,接口(包括注解类型)或enum表示在什么级别保存该注解信息。可选的参数包括RetentionPolicy.SOURCE注解将被编译器RetentionPolicy.CLASS注解在class文件中可用,但会被丢RetentionPolicy.RUNTIMEVM将在运行期也保留注释,因此以通过反射机制注解的信息@ed:将此注解包含在javadoc@Inherited:允许子类继承父类中的注什么是注解的属是传智播客的学生,否则,就不是。如果还想区分出是传智播客哪个班的学生,这时候可以为胸牌在增加一个属性来进行区分。加了属性的标记效果为:@MyAnnotation(color="red")定义基本类型的属性和应用属在注解类中Stringcolor();性对应的方法MyAnnotationa=的一个实例

可以认为上面这个@MyAnnotation是MyAnnotaion为属性指定缺省值Stringcolor()default"yellow";value性:Stringvalue()defaultvalue(即其他属性都采用默认值或者你只有value性),那么可以省略value=部分,例如:@MyAnnotation("lhm")。代码示例[java]view 1.publicclass2.2. publicstaticvoidmain(String[]{{Annotation}}12.@Target({ElementType.METHOD,ElementType.TYPE})//为什么是type而不是public@interfaceAnnotation数组类型的int[]arrayAttr()default{1,2,3};如果数组属性中只有一个元素,这时候属性值部分枚举类型的属EnumTest.TrafficLamplamp()注解类型的属性MetaAnnotationannotationAttr()default@MyAnnotation(annotationAttr=可以认为上面这个@MyAnnotation是MyAnnotaion的一个实例对象,同样的道理,可以认为上面这个@MetaAnnotationMetaAnnotation的一个实例对象,调用代码如下:MetaAnnotation 注解的详细语法可以通过看java语言规范了解,即看javalanguagespecification代码示例[java]view @Annotation(color="red",value="abc",arr={2,3,4},annotation2=@MetaAnotatiopublicclassAnnotationTestpublicstaticvoidmain(String[]{{ Annotationat=(Annotation)AnnotationTest.class.getAnnotation(Ann}}17.20.@Target({ElementType.METHOD,ElementType.TYPE})//为什么是type而不是21.public@interface22. Stringcolordefault"blue设置属性的默认 String intarrdefault{1,2};//设置数组类型属 //EnumTest.TrafficLamplampdefaultEnumTest.TrafficLamp.RED;//类型属 MetaAnotationannotation2default@MetaAnotation("xxx");//属28.30.public@interface31. String33.

泛型是提供给javac编译器使用的,可以限定集合中的输入型,让编译器挡住源程序中的输入,编译器编译带类型说明的集的泛型类型,getClass调用其add方法即可。Jdk1.5以前的集合类中存在什么问[java]view 1.1.ArrayListcollection=iIntegercollection.get(1);//编译要强制类型转换且运行时出错4.Jdk1.5的集合类希望你在定义集合时,明确表示你要向集合中[java]view 1.1.ArrayList<Integer>collection2=i2collection2.get(0);//测试在运行时期会被去掉泛型的“类型”信[java]view 1.import3.3.publicclasspublicstaticvoidmain(String[]args)throwsArrayList<String>al=new al2.getClass().getMethod("add",Object.class).invoke(al2,运用反射调用add方法向里面添加String类型的数 14.ArrayList<Integer>al2=new{4.ArrayList<E>类定义和ArrayList<Integer>类中涉及如术语

整个称为ArrayList<E>泛型类型整个ArrayList<Integer>称为参数化的类型例或实际类型参ArrayList原始类型参数化类型与原始类型的兼容参数化类型可以一个原始类型的对象,编译报警告,例如Collection<String>cnewVector不以,为了兼容原来的代码,可原始类型可以一个参数化类型的对象,编译报警告,例如CollectioncnewVector<String>();//原来的法接受一个集合参数,新的类型也要能传进参数化类型不考虑类型参数的继承关系Vector<String>vnewVector<Object>();Vector<Object>vnewVector<String>();错误可以加入什么类型的数据,记住:Collection<StringCollection<Object>是两个没有转换关系的参数化的类型假设Vector<String>vnewVector<Object>();可以的话,那么以后从v取出的对象String而v际指向的对象中可以加入任意的类型对象;假设Vector<Object>v=newVector<String>();可以的话,那么以后可以向v入任意的类型对象,而v指向的集合中只String型的对象。组的元素不能使用参数化的类型,例如,下面语句有错误:Vector<Integer>vectorList[]=new思考题:下面的代码会报错误Vectorv1=newVector<String>();Vector<Object>v=v1;不会报错,因为编译器只按照语法进行检合中的所有数据,该方法如何定义呢?错误方式[java]view 1.publicstaticvoidprintCollection(Collection<Object>2. for(Object /*cols.add("string");//没 colsnewHashSet<Date>();//10.正确方式[java]view 1.1.publicstaticvoidprintCollection(Collection<?>for(Objectobj:cols)}//cols.add("string");//错误,因为它不知自己未来匹配就一定是String9.cols=new2.总结:使用?通配符可以其他各种参数化的类型,?通配符定义的变量主要用作,可以调用与参数化无关的方法,不能调用与 Vector<?extendNumber>x=newVector<Integer>();//?表示任意Number及Number的子类 Vector<?superInteger>x=newVector<Byte>();//?表示任意Integer及Integer的父类提示:限定通配符总是包括自?只能用作,不能用它去给其他变量赋Vector<?extendsNumber>y=newVector<Number>x=上面的代码错误,原理与Vector<Objectx11new[java]view 1.1.HashMap<String,Integer>hm=new3.5.Set<Map.Entry<String,Integer>>mes=7.9.System.out.println(me.getKey()+":"+6.for(Map.Entry<String,Integer>me:2.JavaBean对我们开发者的作用就是能在不更改源代码的情况下,JavaVBean操作。泛型是JDK1.5出现的新特性,是直接在编译时期检测某个集合或者其他容器中是否添加有的元素,将运行的用法就完全足够我们在开发的时候用了。程序员JAVAJAVA学习笔记2013-07-2615:08198(0收藏------------androidjavajava定义与作用:与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序。当Java序时,首先运行JVM(Java虚拟机),然后再把JavaclassJVM头运行,负责加载Javaclass这部分就叫做ClassLoader。Java虚拟机中可以安装多个类加载器,系统默认三个主要类加类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是不是java类,这正是BootStrap。BootStrap:用本地代码实现的(C++的一段二进制代码)负责加载JavaClass(即所有java.*开头的类);ExtClassLoader:负责加载扩展的Javaclass(例如所有javax.*开头的类和存放在JRE的ext AppClassLoader:负责加载应用程序自身的注:ExtClassLoaderAppClassLoader都是用Java言编写的Bootstrap载的Java虚拟机中的所有类装载器采用具有父子关系的树形结构进当Java虚拟机要加载一个类时,到底派出哪个类加载器去载呢

首先当前线程的类加载器去加载线的第一个类如果类A中了类B,Java虚拟机将使用加载类A的装载器来加载类B还可以直接调用ClassLoader.loadClass()方法来指定某个每个类加载器加载类时,又先委托给其上级类加载器当所有类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChild方法,即使有,那有多个儿子,找哪ClassLoaderTestjre/lib/ext下的.jar中后,运行结果为ExtClassLoader因。每个ClassLoader本身只能分别加载特定位置和 式。类装载器一级级委托到BootStrap类加载器,当BootStrap无法的装载,那就应报告ClassNotFoundException异常。java.lang.System,为了不让我们写System类,类加载采用委托机制,总是使用java系统提供的System知识讲解1.自定义的类加载器的必须继承ClassLoader2.loadClass方法(直接继承,省去委托机制的编写)与findClass方法(覆盖这个就行了编写一个对文件内容进行简单加密的程序和。名定义变量,因为编译器无法识别这个类。程序中可以除了使用ClassLoader.load方法之外,还可以使用设置线程的上下文类加载器或者系统类加载器,然后再使用Class.forName。实验步骤对不带包名的class文件进行加密,加密结果存放到另外一 ,例如:javaMyClassLoaderMyTest.classF:\载器名称为AppClassLoader:javaMyClassLoaderMyTestF:\用加密后的类文件替换CLASSPATH一步操作就出问题了,错误说明是AppClassLoader类装载器装载失败。删除CLASSPATH环境下的类文件,再执行上一步操作就没题了代码示例[java]view 1.import2.3.4. privateStringpath= publicMyClassLoader(Stringpath)throwsException// Filef=new thrownewRuntimeException(path+"isnota this.path= publicClassfindClass(Stringname)throwsException为什么不能抛 Filef=newFile(path,name.substring(name.lastIndexOf('.')+1) FileInputStreamfis=new ByteArrayOutputStreambos=new byte[]buf= return }catch(Exception thrownewClassNotFoundException(name+"isnot return publicstaticvoidcypher(InputStreamistream,OutputStreamostream)ws{//255的字节,当成byte就成了-/*byteb=while((b=(byte)istream.read())!=-{ostream.write(b^intb=while((b=istream.read())!=-{ostream.write(((byte)b)^}}publicstaticvoidmain(String[]args)throws{{ClassLoaderloader=newClasscls=让自定义类继承Datejava.util.Dated=么//Methodm=cls.getMethod("test",null);//在jdk1.5中告,为Methodm= FileInputStreamfis=new FilefnewFile(args[1newFile(args[0]).getName());// FileOutputStreamfos=new 85.87.类加载器不能加载这种非public的88.89.Exceptioninthread"main"java.lang.IllegalAccessException:Class90.cannotaccessamemberofclassMyTestwithmodifiers91.92.93.class94. publicvoid 99. 要为已存在的多个具有相同接口的目标类的各个方法增加一系统功能,例如,异常处理、日志、计算方法的运行时间、事务管理、等等,你准备如何做?编写一个与目标类具有相同接口的类,类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码。(看下页的原理图)客户端程序,在配置文件中配置是使用目标类、还是类,这样以后很容易切换,譬如,想要日志功能时就配置类,否则配置目标类,这样,增加系统功能很容易,以后运行一段时间后,又想去掉系统功能也很容易。个方面,如下所示:安 事 日

用具体的程序代码描述交叉业 {切 切面 }交叉业务的编程问题即为面向方面的编程(AspectorientedprogramAOP),AOP标就是要使交叉业方法中编写切面代码的运行效果是一样的,如下所示切 3 { }切面使用技术正好可以解决这种问题,是实现AOP功能的安全,事务,日志等功能要贯穿到好多个模块中,所以,它就是交叉业重要原则:供货商给你的客为什么要出现动态:要为系统中的各种接口的类增加功能,那将需要太多的类,全部采用静态方式,将是一件非常麻烦的事情!写成百上千个类,是不是太累,JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作类,即动态类。注意:JVM生成的动态类必须实现一个或多个接口,所以JVM生成的动态类只能用作具有相同接口的目标类的如果一个类没有实现接口,可以用CGLIB库动态生成一个类的子类,用这个子类来做这个类的类。类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以在方法中的如下四个位置加上系统功能代码:在调用目标方法之在调用目标方法之在调用目标方法前利用InvocationHandler接口创建类代码示例:[java]view 2.=6.classMyInvocationHandler1implements2.=6.classMyInvocationHandler1implementsInvocationHandler//内部类,实7. publicObjectinvoke(Objectproxy,Methodmethod,Object[] throwsThrowable return 12.17.Collectionproxy1=(Collection)constructor.newInstance(new18.21.//运用内部22.Collectionproxy2=(Collection)constructor.newInstance(new23. publicObjectinvoke(Objectproxy,Methodmethod,Object[] throwsThrowable return 28.30.用Proxy的静态方newProxyInstance(ClassLoaderloader,Class<?>[]interfaces,r32.Collection new new ArrayListtarget=new publicObjectinvoke(Objectproxy,Method Object[]args)throwsThrowable longstartTime= ObjectretVal=method.invoke(target, longendTime= System.out.println(method.getName()+"runningtime:"+(endTime return 46.动态类框架[java]view publicinterfaceAdvicevoidbeforeMethod(Methodmethod);//方法执行之前执行的方voidafterMethod(Methodmethod);//5.publicclassMyAdviceimplementsAdvicelongpublicvoidbeforeMethod(Methodmethod覆盖父类方startTime= publicvoidafterMethod(Methodmethod) longendTime= System.out.println(method.getName()+"runningtime:"+(endTime-}20. publicstaticObjectgetProxy(finalObjecttarget,finalAdviceadvice)传Objectproxy3target.getClass().getClassLoader(),//newInvocationHandler()publicObjectinvoke(Objectproxy,Methodmethod,Object[]throwsThrowableObjectretValmethod.invoke(target,args);// return return38.类加载器就是java中各个类的字节码进行内存的一个途径,JAVA系统有三个类加载器,要明确这三个各个不同的作用。里面应该要重点掌握动态,作用就是给目标类加上一些事务处理,比如说运行时间等等,要掌握写一个动态类的框架。程序员JAVAJAVA学习笔记2013-08-1023:52148(0收藏------------androidjavajava模拟实现十字路口的交通灯管理系统逻辑,具体需求如下由南向而来去往北向的车 直行车由西向而来去往南向的车 右转车由东向而来去往南向的车 左转车信号灯忽略黄灯,只考虑红灯和绿灯应考虑左转车辆控制信号灯,右转车辆不受信号灯控制具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。车辆应先放行直行车辆而后放行左转车辆。每辆车通过路口时1(提示:可通过线程Sleep方设置

随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可不要求实现GUI,只考虑系统逻辑实现,可通过Log方式现程序运行1、设计一个Road类来表示路线,每个Road对象代表一条路线,总共有12路线,即系统中总共要产生12Road例对象。存,在灯绿期间还要每秒钟减少一辆车。每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。每条路线每隔一秒都会检查控制本路线的灯是否为绿,一个灯由绿变红时,应该将下一个方向的灯变绿2、设计一个Lamp类来表示一个交通灯,每个交通灯都一每条路线上都有一个交通灯,共有12个交通灯。右除了右拐弯方向的其他8条路线的灯,它们是两两对的,可以归为4组:南北方向,东西方向,由南向西,由东向所以,在编程处理时,只要从这4组中各取出一个灯对这4灯依次轮询变亮,与这4方向对应的灯则随之一同变化,因此Lamp中要有一个变量来记住自己相反方向的灯,在一个Lamp对象的变亮和变黑方法中,将对应方向的灯也变亮和变黑。每个灯变黑时,都伴随者下一个灯的变亮,Lamp的下一个灯。的都是同一个实例对象,所以Lamp类改用枚举来做显然具有很大的方便性,都只有代表12个方向的灯的实例对象。设计一个LampController类,它定时让当前的绿变红方向图例路线Road对象都有一个namevehicles成员变量来代表Roadvehicles集合中增加一[java]view publicclassRoadprivateList<String>vechicles=newpublicRoad(S=privateStringname ExecutorServicepool=pool.execute(newpublicvoidfor(inttryThread.sleep((newRandom().nextInt(10)+1)*}catch(InterruptedExceptione) vechicles.add(R+"_"+ ScheduledExecutorServicetimer=newpublicvoid booleanlighted=Lamp.valueOf(R).i System.out.println(vechicles.remove(0)+"istraversing!"); }42.交通灯系统中有12个方向上的灯,在程序的其他地方要根据灯的名称就可以获得对应的灯的实例对象,综合这些因素Lamp用java5的枚举形式定义更为简单。每个Lamp中的亮黑状态用lighted表示S2N、S2W、E2W、E2N四个方向上的Lamp象依次轮询变亮,Lamp象中还要有一个opposiampName变量来表示它们相反方向的灯,再用一nextLampName来表示此灯变亮后的下一个变亮的灯。这三个变量用构造方法的形式进行赋值,因为枚举元素必须在定义之后,所以无法再构造方法中彼此相互,所以,相反方向和下一个方向Lamp变亮和变黑的方法:lightblackOut,对于S2N、S2W、E2W、E2N四个方向上的Lamp象,这两个方法内部要让相反方向的灯随之变亮和变黑,blackOut方法还要让下一个灯变除了S2N、S2W、E2W、E2N这四个方向上的Lamp对象之外,其他方向上的Lamp对象的nextLampName和opposiampName属性设置null并且S2N、S2W、E2W、E2N这四个方向Lamp对象nextLampName和opposiampName属性必须设置为null,以便防止lightblackOut死循环。[java]view 1.1.publicenumLampprivateLamp(Stringopposite,Stringnext,booleanthis.next=this.lighted=this.opposite= privateboolean privateString privateString publicboolean return publicvoid this.lighted= if(opposite!= System.out.println(namelampisgreen,下面总共应该有6个方向能 publicLamp this.lighted= if(opposite!= LampnextLamp= if(next!= nextLamp= System.out.println("绿灯从"+name()+ "+ return 44.交通灯控整个系统中只能有一套交通灯控制系统,所LampController类最好是设计成单例LampController构造方法中要设定第一个为绿的灯LampController对象的start方法中将当前灯变绿,然后启动一个定时器,每隔10将当前灯变红和将下一个灯变绿。[java]view publicclassLampControllerprivateLampprivatecurrentLamp=ScheduledExecutorServicetimer=newpublicvoidcurrentLamp=}}19.主函for循环创建出代表12条路线的对象接着再获得LampController对象并调用其start方法[java]view 1.publicclassMainClass publicstaticvoidmain(String[]args) String[]directions=new for(intnew}new}13.分知识,比如说concurrent这个类,它是在并发编很常用的实用工具类。在本节也学到了拿到项目应该怎么去分析项目,从哪着手完成项目,在写代码之前一定要理清思路,根据思路写代码,这样就不会在写代码的时候产生思路。程序员JAVAJAVA学习笔记2013-08-1123:33144(1收藏------------androidjavajava模拟实现银行业务调度系统逻辑,具体需求如下银行内有6业务窗口,14窗口为普通窗口,5窗口为快速窗口,6口为VIP口。有三种对应类型的客户:VIP客户,普通客户,快速客(办理如交水电费、费之类业务的客户)异步随机生成各种类型的客户,生成各类型用户的概率比为:VIP客户:普通客户:快速客户 = 1:6:3。设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。各类型客户在其对应窗口按顺序依次办理业务当VIP(6)窗口和快速业务(5号)窗口没有客户等待办定,可以设置。不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展面向对象的分析与设1、有三种对应类型的客户:VIP客户,普通客户,快速客户,办理业务首先,每一个客户其实就是由银行的一个取号器产生号码的方式来表示的。所以,到要有一个号码管理器对象,独立的,所以,到本系统一共要产生三个号码管理器对象,各要被设计成单例。2、各类型客户在其对应窗口按顺序依次办理业务,准确地说,问的相应的号码管理器,即服务窗口每次找号码管理器获取当前要被服务的号码。类图理解NumberManager定义一个用于上一个客户号码的成员变量和用于所有等待服务的客户号码的队列集合。[java]view import2.import3. *并从集合中出去已被服务的客户号 7.publicclassNumberManager privateintlastNumber=0;// privateList<Integerqueue=newArrayList<Integer>();//定义集合记录客户 publicsynchronizedInteger return publicsynchronizedInteger return 26.NumberMachine定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快VIP户的号码管理器,定义三个对应的方法来返回这三个NumberManager象。因为取号器只有一个,所以将NumberMachine类设计成单例[java]view 1.1. *每个对象都具有各自的客户数量属性,5.publicclassNumberMachineprivatepublicstaticNumberMachine}privateNumberManagerquickManager=newreturnpublicNumberManager}return27.}publicNumberManagerreturn}publicprivateNumberManagervipManager=newprivateNumberManagercommonMana

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论