张孝祥2010年贺岁视频Java高新技术全套.doc_第1页
张孝祥2010年贺岁视频Java高新技术全套.doc_第2页
张孝祥2010年贺岁视频Java高新技术全套.doc_第3页
张孝祥2010年贺岁视频Java高新技术全套.doc_第4页
张孝祥2010年贺岁视频Java高新技术全套.doc_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

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

文档简介

英文缩写IDE: Integrated Development EnvironmentJava EEJmsJmxJndi编译和运行:在eclipse中,Preferencesjava,下的Complier指定编译环境,Installed JREs指定编译好的程序的运行环境。高版本的Java可以运行低版本的javac编译的程序。但底版本的Java无法运行高版本的javac编译的程序。会出现:java.lang.UnsupportedClassVersionError: Bad version number in .class file快捷键:编码时设置快捷键(如输入syso后按Alt+/ 会变成System.out.println):PreferencesGeneral - keys 中选Content Assist。有些预设的快捷键会与其他冲突,所以要Remove Binding然后绑定新的快捷键。View和perspective像Outline,Package Explorer这样的一个个小窗口称为View,一套View的集合组成一个perspective,如Java,Debug。代码模板:选中某语句,能通过右击鼠标-surrounded with -try等,自动加上try catch语句。这些自动补充的代码就是套用了代码模板。代码模板可在Preferences - Java - Editor - Templates中设置。静态导入: import static以前的import语句可以导入一个类或某个包中的所有类。import static可以导入一个类中的某个静态方法或所有静态方法。import static java.lang.Math.*; 导入Math下的所有静态方法。可变参数l 问题:一个方法接受的参数个数不固定,例如: System.out.println(countScore(2,3,5); System.out.println(countScore(1,2,3,5);l 可变参数的特点: 只能出现在参数列表的最后;这个要记住 .位于变量类型和变量名之间,前后有无空格都可以; 调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。增强for循环l 语法: for ( type 变量名:集合变量名 ) l 注意事项: 迭代变量必须在( )中定义! 集合变量可以是数组或实现了Iterable接口的集合类l 举例: public static int add(int x,int .args) int sum = x;for(int arg:args) sum += arg;return sum;基本数据类型的自动装箱与拆箱l 自动装箱: Integer num1 = 12;l 自动拆箱: System.out.println(num1 + 12);l 基本数据类型的对象缓存:Integer num1 = 12;Integer num2 = 12;这块相等,=127都是真的System.out.println(num1 = num2);Integer num3 = 129; 这块不相等,因为是对象Integer num4 = 129;System.out.println(num3 = num4);Integer num5 = Integer.valueOf(12);Integer num6 = Integer.valueOf(12) ; 这块的道理同上System.out.println(num5 = num6);这里需要注意的是第一个输出true,第二个输出为false。因为对于一个字节(-128127)内的数字采用了flyweight pattern,享元模式/蝇量模式。Flyweight模式就是当需要许多相似的小对象时,把可变的属性提取为方法的参数。对象只有一个。枚 举l 为什么要有枚举 问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。 枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。l 用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。 私有的构造方法 每个元素分别用一个公有的静态成员变量表示 可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。public abstract class WeekDay private WeekDay() public static final WeekDay SUN = new WeekDay()Overridepublic WeekDay nextDay() return MON; ; public static final WeekDay MON = new WeekDay()Overridepublic WeekDay nextDay() return SUN; ; public abstract WeekDay nextDay(); /该方法也可以改写为抽象方法public String toString()return this=SUN ? SUN : MON; l 枚举的基本应用 举例:定义一个Weekday的枚举。 扩展:枚举类的values,valueOf,name,toString,ordinal等方法 总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。枚举相当于一个类 ,枚举中的元素,相当于枚举的实例对象。记住枚举的valueof这个静态方法,可以把字符串转换为枚举。枚举的构造方法必须是私有的。l 枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。l 枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。l 带构造方法的枚举 构造方法必须定义成私有的 如果有多个构造方法,该如何选择哪个构造方法? 枚举元素MON和MON()的效果一样,都是调用默认的构造方法。l 带方法的枚举 定义枚举TrafficLamp 实现普通的next方法 实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。 增加上表示时间的构造方法l 枚举只有一个成员时,就可以作为一种单例的实现方式。有抽象方法和参数构造方法的枚举:public enum TrafficLamp GREEN(3)Overridepublic TrafficLamp nextLamp() return YELLOW;,YELLOW(1)Overridepublic TrafficLamp nextLamp() return RED;,RED(2)Overridepublic TrafficLamp nextLamp() return GREEN;private int time; /亮灯时间长度private TrafficLamp(int time)this.time = time;public abstract TrafficLamp nextLamp();代码解释:RED,YELLOW,GREEN是TrafficLamp的实例对象,其后的中定义了一个TrafficLamp的匿名子类,分别赋给了这些对象。RED(2)public TrafficLamp nextLamp()return GREEN;意思是调用了父类TrafficLamp的带参构造方法,生成TrafficLamp的子类,最后把生成的子类赋给RED。补充,实例化子类语句New Date() 这个语句表示实例化Date的子类,子类的构造方法调用父类无参数的构造方法。也可以New Date(300),这时就调用父类带参数的构造方法。反 射反射的基石Class类l 对比提问: Person类代表人,它的实例对象就是张三,李四这样一个个具体的人, Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。对比提问:众多的人用一个什么类表示?众多的Java类用一个什么类表示? 人Person Java类Classl Class类代表Java类,它的各个实例对象又分别对应什么呢? 对应各个类在内存中的字节码,例如,Person类的字节码,ArrayList类的字节码,等等。 一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型是什么呢?l 如何得到各个字节码对应的实例对象( Class类型) 类名.class,例如,System.class 对象.getClass(),例如,new Date().getClass() Class.forName(类名),例如,Class.forName(java.util.Date);l 九个预定义Class实例对象: 参看Class.isPrimitive方法的帮助 Int.class = Integer.TYPEl 数组类型的Class实例对象 Class.isArray()l 总之,只要是在源程序中出现的类型,都有各自的Class实例对象,例如,int,voidClass的定义:Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects. Class has no public constructor. Instead Class objects are constructed automatically by the Java Virtual Machine as classes are loaded and by calls to the defineClass method in the class loaderString str1 = abc;Class cls1 = str1.getClass();Class cls2 = String.class;Class cls3 = Class.forName(java.lang.String);System.out.println(cls1 = cls2); /trueSystem.out.println(cls1 = cls3); /trueSystem.out.println(cls1.isPrimitive(); /falseSystem.out.println(int.class.isPrimitive(); /trueSystem.out.println(int.class = Integer.class); /falseSystem.out.println(int.class = Integer.TYPE); /trueSystem.out.println(int.class.isPrimitive(); /falseSystem.out.println(int.class.isArray();/true反射l 反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Contructor、Package等等。 l 一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象后,得到这些实例对象后有什么用呢?怎么用呢?这正是学习和应用反射的要点。Constructor类l Constructor类代表某个类中的一个构造方法l 得到某个类所有的构造方法: 例子:Constructor constructors= Class.forName(java.lang.String).getConstructors();l 得到某一个构造方法: 例子: Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);/获得方法时要用到类型l 创建实例对象: 通常方式:String str = new String(new StringBuffer(abc); 反射方式: String str = (String)constructor.newInstance(new StringBuffer(abc);/调用获得的方法时要用到上面相同类型的实例对象l Class.newInstance()方法: 例子:String obj = (String)Class.forName(java.lang.String).newInstance(); 该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。 该方法内部的具体代码是怎样写的呢?用到了缓存机制来保存默认构造方法的实例对象。通过反射实例化对象,一般是通过Constructor的newInstance方法。为了简便,Class类也提供了newInstance方法,但只能调用无参的构造方法。Field类l Field类代表某个类中的一个成员变量l 演示用eclipse自动生成Java类的构造方法l 问题:得到的Field对象是对应到类上面的成员变量,还是对应到对象上的成员变量?类只有一个,而该类的实例对象有多个,如果是与对象关联,哪关联的是哪个对象呢?所以字段fieldX 代表的是x的定义,而不是具体的x变量。l 示例代码:ReflectPoint point = new ReflectPoint(1,7);Field y = Class.forName(cn.itcast.corejava.ReflectPoint).getField(y);System.out.println(y.get(point);/Field x = Class.forName(cn.itcast.corejava.ReflectPoint).getField(x);Field x = Class.forName(cn.itcast.corejava.ReflectPoint).getDeclaredField(x);x.setAccessible(true);System.out.println(x.get(point);Class的getField(变量名)方法得到的是public的field。要得到private的field需用getDeclaredField(变量名)方法。要用私有变量还需设置可获取:Field fieldX = p1.getClass().getDeclaredField(x);fieldX.setAccessible(true);System.out.println(fieldX.get(p1);作业:将任意一个对象中所有String类型的成员变量所对应的字符串中的b改为a。private static void changStringValue(Object obj) Field fields = obj.getClass().getFields();for(Field field : fields)if(field.getType() = String.class)String oldValue = (String)field.get(obj);String newValue = oldValue.replace(b, a);field.set(obj, newValue);Method类l Method类代表某个类中的一个成员方法l 得到类中的某一个方法: 例子: Method charAt = Class.forName(java.lang.String).getMethod(charAt, int.class);l 调用方法: 通常方式:System.out.println(str.charAt(1); 反射方式: System.out.println(charAt.invoke(str, 1); 如果传递给Method对象的invoke()方法的第一个参数为null,说明该Method对象对应的是一个静态方法!l jdk1.4和jdk1.5的invoke方法的区别: Jdk1.5:public Object invoke(Object obj,Object. args) Jdk1.4:public Object invoke(Object obj,Object args),即按jdk1.4的语法,需要将一个数组作为参数传递给invoke方法时,数组中的每个元素分别对应被调用方法中的一个参数,所以,调用charAt方法的代码也可以用Jdk1.4改写为 charAt.invoke(“str”, new Object1)形式。用反射方式执行某个类中的main方法l 目标: 不用反射,调用main方法的代码:TestArguments.main(new Stringaaa,bbb,ccc); 写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法。用普通方式调完后,大家要明白为什么要用反射方式去调啊?l 问题: 启动Java程序的main方法的参数是一个字符串数组,即public static void main(String args),通过反射方式来调用这个main方法时,如何为invoke方法传递参数呢?按jdk1.5的语法,整个数组是一个参数,而按jdk1.4的语法,数组中的每个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac会到底按照哪种语法进行处理呢?jdk1.5肯定要兼容jdk1.4的语法,会按jdk1.4的语法进行处理,即把数组打散成为若干个单独的参数。所以,在给main方法传递参数时,不能使用代码mainMethod.invoke(null,new String“xxx”),javac只把它当作jdk1.4的语法进行理解,而不把它当作jdk1.5的语法解释,因此会出现参数类型不对的问题。l 解决办法: mainMethod.invoke(null,new Objectnew Stringxxx); mainMethod.invoke(null,(Object)new Stringxxx); ,编译器会作特殊处理,编译时不把参数当作数组看待,也就不会数组打散成若干个参数了String className = args0;Method mainMethod = Class.forName(className).getMethod(main,String.class);mainMethod.invoke(null, (Object)(new String111,222,333);数组的反射l 具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。l 代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。l 基本类型的一维数组可以被当作Object类型使用,不能当作Object类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object类型使用。int a1 = new int1,2,3;Object aObj3 = a1; /对Object aObj3 = a1; /错l Arrays.asList()方法处理int和String时的差异。Arrays.asList(String),放回一个List,List中的元素就是原来String中的元素。而Arrays.asList(int,放回一个List,只有一个元素,就是int本身。l Array工具类用于完成对数组的反射操作。如果传入的对象是数组,则一个个打印数组元素,如果是非数组则直接打印:private static void printObject(Object obj) Class clazz = obj.getClass();if(clazz.isArray()int len = Array.getLength(obj);for(int i=0;ilen;i+)System.out.println(Array.get(obj, i);elseSystem.out.println(obj);Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensionsint a1 = new int3;int a2 = new int4;System.out.println(a1.getClass() = a2.getClass(); /trueArrays.asList方法,如果参数是String,则会提取元素,组成List。如果是int这样的基本类型,因为基本类型不是Object,所以组成的List中只有一个元素:int。补充,理解数组:int a3 = new int34;String a4 = new String3;a3是一个数组,数组的每个元素的类型是int.a4是一个数组,数组的每个元素的类型是StringHashcodeHashcode只有在实现了哈希算法的数据结构(如HashSet)中才有用。HashSet 是如何保证元素唯一性的呢?是通过元素的两个方法,hashCode和equals来完成。如果元素的hashcode值不同,不会调用equals。如果元素的HashCode值相同,才会判断equals是否为true。当HashCode值和equals都为true时,两个对象认为是同一个对象。Collection col = new HashSet();ReflectPoint p1 = new ReflectPoint(3,3); / ReflectPoint类中基于x,y编写hashcode和equals方法ReflectPoint p2 = new ReflectPoint(5,5);col.add(p1);col.add(p2);System.out.println(col.size(); /2p1.y = 6; /p1的值改变,导致hashcode改变,在原来的HashSet中将无法找到相等的元素,所以无法remove,造成内存泄漏.col.remove(p1);System.out.println(col.size();/仍旧是2用类加载器加载资源文件InputStream ips = ReflectTest2.class.getClassLoader().getResourceAsStream(perties ); / perties位于classPath目录下InputStream ips = ReflectTest2.class.getClassLoader().getResourceAsStream(cn/itcast/day1/perties);/ perties位于n.itcast.day1包下InputStream ips = ReflectTest2.class.getResourceAsStream(perties); /在ReflectTest2的同一包下InputStream ips = ReflectTest2.class.getResourceAsStream(/cn/itcast/resources/perties); /在ReflectTest2不同的包下Properties props = new Properties();props.load(ips);ips.close();String className = props.getProperty(className);/Collection col = (Collection)Class.forName(className).newInstance();内省(introspector)和javabeanl JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。l 如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,大家觉得这些方法的名称叫什么好呢?JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id,至于你把它存到哪个变量上,用管吗?如果方法名为getId,中文意思即为获取id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。 setId()的属性名id isLast()的属性名last setCPU的属性名是什么?CPU getUPS的属性名是什么?UPS总之,一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。l 一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处,我们才会去了解和应用JavaBean!好处如下: 在Java EE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作,别人都这么用和要求这么做,那你就没什么挑选的余地! JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。如果要你自己去通过getX方法来访问私有的x,怎么做,有一定难度吧?用内省这套api操作JavaBean比用普通类的方式更方便。通过内省取得javabean的属性值(使用PropertyDescriptor)private static Object getProperty(Object pt1, String propertyName)throws IntrospectionException, IllegalAccessException,InvocationTargetException PropertyDescriptor pd1 = new PropertyDescriptor(propertyName,pt1.getClass();Method methodGetX = pd1.getReadMethod();Object retVal = methodGetX.invoke(pt1);return retVal;通过内省设置javabean的属性值private static void setProperty(Object pt1, String propertyName,Object value) throws IntrospectionException,IllegalAccessException, InvocationTargetException PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,pt1.getClass();Method methodSetX = pd2.getWriteMethod();methodSetX.invoke(pt1, value);使用内省,得到一个javabean所有的属性及其值:ReflectPoint point = new ReflectPoint(3,4,zhangsan,false);BeanInfo beanInfo = Introspector.getBeanInfo(point.getClass();PropertyDescriptor propDescs = beanInfo.getPropertyDescriptors();for(PropertyDescriptor propDesc : propDescs)String propName = propDesc.getName();Method getMethod = propDesc.getReadMethod();System.out.println(propName + : + getMethod.invoke(point) ;BeanUtils工具包的使用l 演示用eclipse如何加入jar包,先只是引入beanutils包,等程序运行出错后再引入logging包。l 在前面内省例子的基础上,用BeanUtils类先get原来设置好的属性,再将其set为一个新值。 get属性时返回的结果为字符串,set属性时可以接受任意类型的对象,通常使用字符串。l 用PropertyUtils类先get原来设置好的属性,再将其set为一个新值。 get属性时返回的结果为该属性本来的类型,set属性时只接受该属性本来的类型。l 演示去掉JavaBean(ReflectPoint)的public修饰符时,BeanUtils工具包访问javabean属性时出现的问题。BeanUtils可以操作属性链BeanUtils.setProperty(pt1, birthday.time, 111);BeanUtils可以接受String作为参数值,它会自动转换,PropertyUtils只能根据bean实际的类型来赋值;BeanUtils.setProperty(pt1, x, 9);PropertyUtils.setProperty(pt1, x, 8);Map和Bean有相似的结构,都是键值对,可以用BeanUtils来操作Map。注解l 先通过SuppressWarnings的应用让大家认识和了解一下注解: 通过System.runFinalizersOnExit(true);的编译警告引出SuppressWarnings(deprecation) l Deprecated 直接在刚才的类中增加一个方法,并加上Deprecated标注,在另外一个类中调用这个方法。l Override public boolean equals(Reflect other)方法与HashSet结合讲解l 总结: 注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。 看java.lang包,可看到JDK中提供的最基本的annotation34 continueRetention(RetentionPolicy.RUNTIME)Target(ElementType.METHOD,ElementType.TYPE)public interface ItcastAnnotation String color() default blue;String value();int arrayAttr() default 3,4,5;TrafficLamp lamp() default TrafficLamp.RED;MetaAnnotation annotationAttr() default MetaAnnotation(LMN);泛型ArrayList collection1 = new ArrayList();ArrayList collection2 = new ArrayList();System.out.println(collection1.getClass()=collection2.getClass();输出true。范型信息只提供给编译器使用,在编译好的class文件中已去掉了类型信息。思考题:不会报错。自定义范型方法:自定义范型类DAO: Data Access ObjectCRUD: Create Retrieve Update Delete通过反射获得范型的参数化类型。注意:通过反射是无法得到一个变量的范型类型的,如Vector v1 = new Vector();public static void applyVector(Vector v1)Method appMethod = GenericTest.class.getMethod(applyVector, Vector.class);Type paraTypes = appMethod.getGenericParameterTypes();ParameterizedType paraType = (ParameterizedType)paraTypes0;System.out.println(paraType.getRawType();System.out.println(paraType.getActualTypeArguments()0);ParameterizedType represents a parameterized type such as Collection.getRawType()输出的是java.util.VectorgetActualTypeArguments()返回的是一个范型数组,因为有时一个基本类型可包含多个范型,如Map。类加载器类加载器的委托机制面试题:能不能自己写个类叫java.lang.System,来替换java提供的System类?不行,由于类加载的委托机制,父加载器会优先查找类,如找到就加载。编写自己的类加载器:实例:编写一个NetworkClassLoaderclass NetworkClassLoader extends ClassLoader String host; int port; public Class findClass(String name) byte b = loadClassData(name); return defineClass(name, b, 0, b.length); private byte loadClassData(String name) / load the class data from the connection . 如果在eclipse中遇到问题,看Problems这个View来查找问题。类加载器的一个高级问题:Ext目录是指JDK中的ext目录D:javaprogramsJavajdk1.6.0_01jrelibext。放在tomcat中的servlet是由tomcat中的类加载器org.apache.catalina.loader.WebappClassLoader 加载的。其树机构是:org.apache.catalina.loader.WebappClassLoaderorg.apache.catalina.loader.StandardClassLoadersun.misc.Launcher$AppClassLoadersun.misc.Launcher$ExtClassLoader如果把MyServlet打成jar包,放入jdk的ext目录,则当请求该servlet时,ExtClassLoader可以找到该类,就加载,但在加载过程中又要加载MyServlet的父类HeepServlet,这时,因为ext目录中不存在这个类,ExtClassLoader无法加载,就报错:类无法找到。代理代理的概念与作用:代理的框架图:在Client程序中应该只出现接口。AOP:Aspect Oriented Program 面向切面编程动态代理技术:快捷键:Ctrl+shift+/ : 注释一段代码 Ctrl+shift+:取消注释JVM动态生成类:创建动态代理需考虑提供的三样东西:1、类加载器,一般用目标对象的类加载器2、接口。3、实现InvocationHandler接口的类创建Collection的动态代理类:Class cl

温馨提示

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

评论

0/150

提交评论