零.类的加载时机

一.类加载器

1.概述:在jvm中,负责将本地上的class文件加载到内存的对象
2.分类:- BootstrapClassLoader 根类加载器-->C语言写的,我们获取不到​    也被称为引导类加载器,负责Java核心类的加载​ 比如System,String等。jre/lib/rt.jar下的类都是核心类 ---------------------------------     - ExtClassLoader 扩展类加载器​  负责JRE的扩展目录中jar包的加载。​    在JDK中JRE的lib目录下ext目录- AppClassLoader 系统类加载器​    负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包(第三方jar包)和类路径。或者自定义的类----------------------------------------------------AppClassLoader的父加载器是ExtClassLoaderExtClassLoader的父加载器是BootstrapClassLoader但是他们不是子父类继承关系,他们有一个共同的爹-->ClassLoader---------------------------------------------------- 3.获取加载器对象类名.class.getClassLoader4.双亲委派(全盘负责委托机制) 谁用谁加载a.Person中有一个StringPerson本身是AppClassLoader加载String是BootstrapClassLoaderb.加载顺序:Person本身是AppClassLoader加载,String本来按理来说是AppClassLoader但是AppClassLoader加载String的时候,会去问一问ExtClassLoader,嗨,ext,你加载吗?ext说:偶no,我不负责加载核心类,我负责的是扩展类,所以你别急,我给你找人(BootstrapClassLoader)ext说:boot,你加载String吗?boot:哎,正好我加载核心类,行吧,我加载吧
-----------------------------------------------------------假如:ext和boot都不加载,app才会自己加载class Test{new Person()}a.AppClassLoader负责加载Test,然后按道理来讲Person也是由AppClassLoader加载到内存但是App先不加载,先去找ExtClassLoader,Ext不负责加载自定义类,Ext就去找Boot但是Boot只负责加载核心类,所以Boot也不加载
b.最后App看两个双亲不加载,自己就加载了Person
-----------------------------------------------------------
c.类加载器的cache(缓存)机制:如果cache中保存了这个类就直接返回它,如果没有才加载这个类,然后存入cache中,下一次如果有其他类在使用的时候就不会在加载了,直接去cache缓存拿即可。这就是为什么每个类只加载一次,内存只有一份的原因。举例:还是上述代码中,当第一次使用System类的时候,那么System类就会被加载了,那么System类就会存储到内存中了,当下面代码中我们再一次使用System类的时候,由于内存中已经有了,那么就不会在去加载了,这时会直接拿过来用即可。因此方法区中每一个类的字节码文件只有一份的原因由全盘负责、委托机制和类加载器的cache(缓存)机制共同决定。也称为双亲委派机制5.双亲委派作用:(一个类在内存中加载几次呢?->1次)能够让Class类加载一次创建一个Class对象
/*类名.class.getClassLorder()这个类的加载器ClassLorder类的方法 getParent()返回父加载器
*/
public class ClassLoader {@Testpublic void classLorder(){//三个类加载器的关系//父子关系ClassLoader c1 = ClassLoader.class.getClassLoader();System.out.println(c1);ClassLoader c2 = c1.getParent();System.out.println(c2);ClassLoader c3 = c2.getParent();System.out.println(c3);}//获取AppClassLoader 系统类加载器@Testpublic void app(){//ClassLoader为本类类名ClassLoader c1 = ClassLoader.class.getClassLoader();System.out.println(c1);}//获取ExtClassLoader 扩展类加载器@Testpublic void ext(){ClassLoader c1 = DNSNameService.class.getClassLoader();System.out.println(c1);}//BootstrapClassLoader 根类加载器@Testpublic void boot(){//引导类加载器,不是类,JVM内部,返回值nullClassLoader cl = String.class.getClassLoader();System.out.println(cl);}
}

二.反射

1.概述:根据Class对象操作Class对象中的成员

三.反射之获取Class对象

获取Class对象的方式:1.new对象 调用 getClass()->Object中的方法2.类名.class->class->每个数据类型,不管是基本的还是引用的,jvm都赋予了他们一个静态属性名字就叫做class3.Class中方法->forName(String className)注意:class就加载一次,Class对象也就一个,用3中方式获取出来的Class是同一个------------------------------------------------------------       问题:3种获取Class对象的方式,哪个在开发中最常用:forName使用forName(Stirng className)->扩展性更好,灵活性更高因为:参数是一个字符串,将来我们可以将类的全限定名放在配置文件中,然后用io流读取,读取出来的字符串(全限定名)可以当做参数放在forName中这样,我们想获取不同的Class对象,直接改文件名就可以了,不用修改可以代码实现一下:a.在模块下创建prop.propertiesclassName=cn.itcast.day21.e_fanshe04.Studentb.创建测试类:public class Demo02_ForName {public static void main(String[] args) throws Exception {//创建Properties集合Properties properties = new Properties();FileInputStream fis = new FileInputStream("day21\\pro.properties");properties.load(fis);//根据className获取对应的valueString className = properties.getProperty("className");//获取value的class对象Class person = Class.forName(className);System.out.println(person);}
}
public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}private Person(String name){this.name = name;System.out.println("我是私有的构造");}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return name+"..."+age;}
}
//测试类
public class Test01 {public static void main(String[] args) throws ClassNotFoundException {//每个数据类型,不管基本还是引用数据类型,jvm都赋予了这个类型一个静态属性,名字叫classClass aClass = Person.class;Class aClass1 = Class.forName("cn.itcast.day15.class02.Person");//Object类中的getClass方法Person person = new Person();Class aClass2 = person.getClass();System.out.println(aClass==aClass1);System.out.println(aClass==aClass2);}
}

四.获取Class对象中的构造方法

一.获取所有public的构造方法

   反射通用的使用方式:1.获取要操作类的class对象2.利用Class类中的方法获取类中的成员(构造,变量,方法)3.运行获取出来的成员获取Class对象中的构造方法:Constructor<?>[] getConstructors()->获取所有的构造方法(public修饰的)
public class Demo01_Constructor {public static void main(String[] args) throws Exception{//获取Person类的Class对象Class pClass = Class.forName("cn.itcast.day20.fanshe02.Person");Constructor[] constructors = pClass.getConstructors();//遍历数组for (Constructor constructor : constructors) {System.out.println(constructor);}}
}

二.获取空参构造

       1.获取指定的构造方法:Constructor<T> getConstructor(Class<?>... parameterTypes):获取指定public的构造parameterTypes:需要传递参数类型的class对象如果获取的是无参构造,参数不写2.Constructor类中的方法T newInstance(Object...initargs)-->创建对象->new Person("柳岩",1)如果使用此方法创建的是无参构造,参数不用写此方法相当于:new Person() 或者 new Person("柳岩",1)
 private static void method01() throws Exception {//获取Person类的Class对象Class pClass = Class.forName("cn.itcast.day20.fanshe02.Person");//获取无参构造Constructor constructor = pClass.getConstructor();Object o = constructor.newInstance();//Person p = new Person()System.out.println(o);}

三.利用空参构造创建对象的快捷方式

       1.利用空参构造创建对象的快捷方式直接调用Class类中的newInstance方法前提:被反射的类,必须具有public权限的无参构造
    private static void method02()throws Exception {//获取Person类的Class对象Class pClass = Class.forName("cn.itcast.day20.fanshe02.Person");Object o = pClass.newInstance();System.out.println(o);}

四.利用反射获取有参构造并创建对象

1.获取指定的构造方法:Constructor<T> getConstructor(Class<?>... parameterTypes)parameterTypes:需要传递参数类型的class对象如果获取的是无参构造,参数不写2.Constructor类中的方法T newInstance(Object...initargs)-->创建对象->new Person("柳岩",1)如果使用此方法创建的是无参构造,参数不用写
public class Demo03_Constructor {public static void main(String[] args) throws Exception{//获取Person类的Class对象Class pClass = Class.forName("cn.itcast.day20.fanshe02.Person");//获取有参构造Constructor constructor = pClass.getConstructor(String.class, int.class);System.out.println(constructor);//创建对象//Person p = new Person("柳岩", 36)Object o = constructor.newInstance("柳岩", 36);System.out.println(o);}}

五.利用反射获取私有构造(暴力反射)

获取私有的构造(扩展):Constructor<?>[] getDeclaredConstructors()->获取所有的构造,包括私有的Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)  ->获取指定的构造AccessibleObject类中的方法-->暴力反射void setAccessible(boolean flag)flag:false->代表不能访问私有的成员flag:true->解除私有权限
public class Demo04_Constructor {public static void main(String[] args) throws Exception{//获取Person类的Class对象Class pClass = Class.forName("cn.itcast.day20.fanshe02.Person");//method01(pClass);method02(pClass);}private static void method02(Class pClass)throws Exception {//获取私有的构造方法Constructor dds = pClass.getDeclaredConstructor(String.class);//解除私有权限dds.setAccessible(true);//创建对象Object o = dds.newInstance("郭磊");System.out.println(o);}/*获取所有的构造->包括私有*/public static void method01(Class pClass){Constructor[] dds = pClass.getDeclaredConstructors();//遍历数组for (Constructor dd : dds) {System.out.println(dd);}}}

六.利用反射获取所有成员方法

利用反射获取类中的方法:Method[] getMethods()获取所有的方法,public
public class Demo05_Method {public static void main(String[] args)throws Exception {Class c = ClassUtils.getC();//抽出来的工具类可以不抽取Method[] methods = c.getMethods();//遍历数组for (Method method : methods) {System.out.println(method);}}
}

七.反射之获取方法(有参,无参)

 利用反射获取类中的方法:Method[] getMethods()获取所有的方法,publicMethod getMethod(String name,Class<?>...parameterTypes)name:获取的方法名parameterTypes:该方法的参数类型Method中有一个方法Object invoke(Object obj, Object... args)obj:反射的类的对象args:运行方法传递的实参如果执行的方法是void,调用invoke方法没必要必须用返回值接收如果执行的方法没有参数,那么args不用写
public class Demo06_Method {public static void main(String[] args)throws Exception {Class c = ClassUtils.getC();System.out.println("---------获取setName方法-------------");//获取set方法Method setName = c.getMethod("setName", String.class);//利用空参构造创建Person对象Object o = c.newInstance();//Person o = new Person()//调用方法setName.invoke(o, "柳岩");System.out.println(o);System.out.println("---------获取getName方法-------------");Method getName = c.getMethod("getName");//执行getName方法,有返回值的Object invoke = getName.invoke(o);System.out.println(invoke);}
}

五.反射练习(编写一个小框架)

利用反射,解析配置文件中的信息文件中配置的信息是类的全限定名   className=cn.itcast.day20.fanshe03_test.Person类中的某一个方法名  methodName=eat步骤:1.创建配置文件->properties存的信息键值对的形式问题1:配置文件放在哪里?放在src下->切记问题2:项目开发完,交给用户使用,给用户的是编译后的class文件,而out目录存放的就是class文件问题3:如果我们将配置文件放在模块下,out目录下是没有配置文件的,那么代码运行需要读配置文件的信息所以给了用户,用户一执行,卡,报错了,因为没读到配置文件的信息解 决:如果将配置文件放在src下面,idea生成的out目录中这个配置文件会显示在out的项目路径下注意的是:src 存放的是源代码 编译后产生的class文件,是同步的,但是生成的out路径,下没有src这个目录,因为src存放源代码的问题:如何读取src目录下的文件?直接new FileInputStream(模块名\\src\\配置文件名)是不行的因为这样写,而我们给的用户是out下的资源,而out下存放的class文件路径是没有src所以这样写,给了用户,用户一使用,直接就读不到这个配置文件了解决:使用类的加载器ClassLoader类中的方法InputStream getResourceAsStream("直接写文件名")返回一个字节输入流此流会自动扫描src下的配置文件2.利用IO流读取配置文件读到Properties集合中3.获取Properties中对应的值获取类的全限定名方法名4.利用反射获取类的Class对象利用反射去指定方法
//在src下创建一个pro.properties文件
className=cn.itcast.day15.class02.Person
methodName=eat
public class Test {public static void main(String[] args)throws Exception{//获取类加载器ClassLoader classLoader = Test.class.getClassLoader();//使用类加载器的输入流读取配置文件InputStream in = classLoader.getResourceAsStream("config.properties");//创建Properties集合Properties properties = new Properties();//调用load方法,将流中的配置文件读取到Properties集合中properties.load(in);//获取配置文件中的valueString className = properties.getProperty("className");//cn.itcast.day20.fanshe03_test.PersonString methodName = properties.getProperty("methodName");//eat//根据获取出来的className创建Person的Class对象Class aClass = Class.forName(className);//根据从配置文件中解析出来的方法名去获取Person中的方法Method method = aClass.getMethod(methodName);//创建对象Object o = aClass.newInstance();//执行方法method.invoke(o);}
}

六.注解

一.注解的介绍

 1.jdk1.5版本的新特性->一个引用数据类型和类,接口,枚举是同一个层次的2.作用:说明:对代码进行说明,生成doc文档(API文档)(不会用)检查:检查代码是否有错误   @Override(会用)分析:对代码进行分析,起到了代替配置文件的作用(会用)3.JDK中的注解:@Override  ->  检测此方法是否为重写方法jdk1.5版本,支持父类的方法重写jdk1.6版本,支持接口的方法重写@Deprecated -> 方法已经过时,不推荐使用调用方法的时候,方法上会有横线,但是能用@SuppressWarnings->消除警告  @SuppressWarnings("all")

二.注解的定义以及属性的定义格式

   1.自定义注解格式:修饰符 @interface 注解名{属性}2.属性的定义格式:为了提高注解作用- 格式1:数据类型 属性名();-->没有默认值的-->需要后面赋值- 格式2:数据类型 属性名() default 默认值;-->可以改变的3.注解中能够定义什么样的属性- 八种基本数据类型(int,float,boolean,byte,double,char,long,short)。- String类型,Class类型,枚举类型,注解类型。- 以上所有类型的一维数组。int[][] arr = {{1,2},{3,4}}     [0][0]    [1,0]->3
public @interface Book {//书名String bookName();//价格double price();//作者String[] author();//数量//Integer count();错误,不能使用包装类//int count() default 10;这个是可以的,定义属性的时候可以指定默认值
}

三.注解的使用

//注解的使用
/*使用注解,就是为注解的属性赋值格式:@注解名(属性名=值,属性名=值)如果属性是数组数组的赋值-->属性名 = {"曹雪芹","高鹗"}注解,可以写在类上,方法上,参数位置都行
*/
@Book(booName = "红楼梦",price = 200.9,author = {"曹雪芹","高鹗"})
pubilc class BookShelf{}
注解注意事项:1.空注解可以直接使用2.一个对象中不能连续使用同一个注解多次,但是一个对象中可以使用多个不同的注解(不同的位置可以使用一样的注解,但是同样的位置不能使用一样的注解)3.使用注解时,如果此注解中有属性,注解中的属性一定要赋值,如果有多个属性,用,隔开如果注解中的属性有数组,那么如果数组只有一个元素值,那么{}不用写,反之用写4.如果注解中的属性值有默认值,那么我们不必要写,也不用重新赋值,反之必须写上5.如果注解中只有一个属性,并且属性名叫value,那么使用注解的时候,属性名不用写

四.注解解析的方法

注解解析:获取注解中的属性值接口:AnnotatedElement接口中的方法(用于解析注解的接口)boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)判断当前class对象是否有指定的注解返回值:boolean  返回的是true,证明该class对象上有注解;返回的是false,证明该class对象没有注解Class<? extends Annotation> annotationClass传递的是class对象, 传递的其实就是该class对象上对应注解的class对象<T extends Annotation> getAnnotation(Class<T> annotationClass)->获得当前class对象上指定的注解对象。解释:参数传递的是注解的class对象传递哪个注解类型,返回的就是哪个注解对象AnnotatedElement毕竟是个接口,你有实现类实现类:Class类  Constructor构造方法 Field成员变量  Method成员方法结论:注解的解析,和哪个技术密切相关--> 反射需求:获取BookShelf1类上的注解Book的属性值=====================================================注解的解析思想:1.反射带有注解的类2.判断这个类上是否有注解3.获取这个注解4.获取注解中的属性值------------------假如我们要是解析方法上的注解属性值1.反射带有注解的类2.反射方法->getMethod-->Method3.判断方法上是否有注解4.获取这个注解5.获取注解的属性值
@Book(booName = "红楼梦",price = 200.9,author = {"曹雪芹","高额"})
pubilc class BookShelf{}/*运行之后发现没有输出,而且c.isAnnotationPresent(Book.class)判断为false,明明类上有注解,但是却返回false,为啥呢?那么我们接下来学习一下元注解
*/
public class Test01 {public static void main(String[] args)throws Exception {//1.反射带有注解得类Class c = Class.forName("cn.itcast.day21.zhujie02.BookShelf01");//2.判断这个类上是否有注解boolean b = c.isAnnotationPresent(Book.class);System.out.println(b);if (b){//如果有注解,获取注解//Annotation annotation = c.getAnnotation(Book.class);Book book = (Book) c.getAnnotation(Book.class);//获取注解中的属性值System.out.println("书名:"+book.bookName());System.out.println("价格:"+book.price());System.out.println("作者:"+ Arrays.toString(book.author()));}}
}

七.元注解

*** 自定义的注解 Book* 定义属性** JDK的元注解,比喻注解的总管* 管理其他的注解** 元注解对我们的注解进行控制* 1: 控制我们的注解,可以写在哪里,(类,方法,变量上,包...)* 2: 控制我们的注解的生命周期** JDK的2个元注解** @Target  指示其他注解,出现的位置->点进Target底层*    ElementType[] value(); 数组,可以赋值多个->点ElementType底层*    ElementType是数据类型,是枚举*    枚举的属性,都是静态修饰,直接类名调用*      TYPE, 其他注解可以写在类上*      FIELD,其他注解可以写在成员变量*      METHOD,其他注解可以写在方法上*      PARAMETER,其他注解可以写在方法参数上*      CONSTRUCTOR,其他注解可以写在构造方法上**  @Retention 指示其他注解的生命周期->点到Retention底层*     RetentionPolicy value(); 不是数组,赋值一个->点到RetentionPolicy底层*     RetentionPolicy数据类型*     枚举的属性,都是静态修饰,直接类名调用*     SOURCE(默认级别) 注解仅存在于源码中java文件中(不在class文件中,也不在方法区中)->@Override只是检                        测方法是否为重写方法*     CLASS  注解存在于编译后的class文件中->Class文件中出现了,方法区中没有*     RUNTIME 运行时期的内存中-->方法区中出现了,一旦在方法区中出现了,我们才能利用反射获取到注解所以当我们在注解上写SOURCE 运行上面的Test案例判断类上有没有注解,才会返回false*/
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Book {//书名String bookName();//价格double price() ;//作者String[] author();
}------------------------------------
@Book(booName = "红楼梦",price = 200.9,author = {"曹雪芹","高额"})
pubilc class BookShelf{@Book(booName = "红楼梦",price = 200.9,author = {"曹雪芹","高额"})public void lookBook(){System.out.println("看书");}
}

八.注解再次解析

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Book {String bookName();double price();String[] author();
}@Book(booName = "红楼梦",price = 200.9,author = {"曹雪芹","高鹗"})
pubilc class BookShelf{}
=================================================================
public class Test01 {public static void main(String[] args)throws Exception {//1.反射带有注解得类Class c = Class.forName("cn.itcast.day21.zhujie03.BookShelf");//2.判断这个类上是否有注解boolean b = c.isAnnotationPresent(Book.class);System.out.println(b);if (b){//如果有注解,获取注解//Annotation annotation = c.getAnnotation(Book.class);Book book = (Book) c.getAnnotation(Book.class);//获取注解中的属性值System.out.println("书名:"+book.bookName());System.out.println("价格:"+book.price());System.out.println("作者:"+ Arrays.toString(book.author()));}}
}

九.模拟Junit练习

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {}
  /*使用@MyTest注解哪个方法上有@MyTest我们就让哪个方法执行*/
public class Test01 {@MyTestpublic void method01(){System.out.println("我是method01");}public void method02(){System.out.println("我是method02");}@MyTestpublic void method03(){System.out.println("我是method03");}/*1.反射带有注解的类2.反射方法->getMethod-->Method3.判断方法上是否有注解4.获取这个注解5.获取注解的属性值*/public static void main(String[] args) throws Exception{//1.获取本类的Class对象Class aClass = Test01.class;//创建对象Object o = aClass.newInstance();//2.获取方法Method[] methods = aClass.getMethods();
//        3.判断方法上是否有注解for (Method method : methods) {boolean b = method.isAnnotationPresent(MyTest.class);if (b){//如果方法上有注解,直接invoke执行method.invoke(o);}}}
}

十.Lombok(day28讲解)

使用的注解有:@Data->包含get/set,toString,hashCode,equals,无参构造方法@Getter->生成get方法@Setter->生成set方法@NoArgsConstructor和@AllArgsConstructor- @NoArgsConstructor:无参数构造方法。- @AllArgsConstructor:满参数构造方法。@@EqualsAndHashCode->生成hashCode和Equals

day26【反射_注解】课上相关推荐

  1. 注解开发不方便_注解(上)

    注解,和反射一样,是Java中最重要却最容易被人遗忘的知识点.哪怕Spring.SpringMVC.SpringBoot等框架中充满了注解,我们还是选择性地忽视它.很多人不明白它是怎么起作用的,甚至有 ...

  2. 88 java反射_4 _注解

    文章目录 枚举 枚举的本质 枚举与Switch配合使用 注解 定义注解 注解属性类型 注解的本质 反射获取注解信息 元注解 枚举 什么是枚举: 枚举是一个引用类型,枚举是一个规定了取值范围的数据类型. ...

  3. 北邮java作业代码_北邮 java 作业7 设计模式2,李颉老师的课上作业设计模式2

    [实例简介] 北邮 java 作业7 设计模式2,李颉老师的课上作业设计模式2 [实例截图] [核心代码] 67506242buptjavahomework ├── _14211133_孙杨_7_Ad ...

  4. 反射、注解、动态代理、JDK8新特性

    反射.注解.动态代理.JDK8新特性 第一章.反射 1.类的加载 源文件--通过javac编译-->字节码文件---通过Java命令(通过ClassLoader)--->JVM运行字节码文 ...

  5. 2108-微服务课上问题分析及总结

    文章目录 Day01~微服务架构入门 核心知识点 常见问题分析 常见Bug分析 课堂练习 课后作业 Day02~Nacos注册中心入门 核心知识点 常见问题分析 常见Bug分析 课堂小技巧 课后作业 ...

  6. 学习Kotlin(七)反射和注解

    推荐阅读: 学习Kotlin(一)为什么使用Kotlin 学习Kotlin(二)基本语法 学习Kotlin(三)类和接口 学习Kotlin(四)对象与泛型 学习Kotlin(五)函数与Lambda表达 ...

  7. 使用基于注解的mybatis时,利用反射和注解生成sql语句

    在开发时遇到一个问题,在使用基于注解的mybatis插入一个对象到mysql时,在写sql语句时需要列出对象的所有属性,所以在插入一个拥有10个以上属性的对象时sql语句就会变得很长,写起来也很不方便 ...

  8. junit单元测试,反射,注解

    今日内容 1. Junit单元测试 2. 反射 3. 注解 Junit单元测试: * 测试分类:1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值.2. 白盒测试:需要写代码的.关注程 ...

  9. java 注解与反射_Java注解与反射直接上手

    什么是注解(Annotation) 注解顾名思义为注释.讲解,可以理解为一种标签或标记,可以用在类.方法或者域上.向类.方法等添加注解,相当于给他们贴上了一层标签. 注解使用 在使用注解时,在类名.方 ...

最新文章

  1. 毫米波雷达基本技术与应用
  2. PyTorch | torch.full()使用方法 | torch.full()如何使用? torch.full()例子说明 | 通过torch.full创建全相同的张量
  3. linux查找出全部doc文件,linux 查找出包含某个字符串的所有文件的方法详解
  4. Seata多微服务互相调用_全局分布式事务使用案例_seata之原理剖析---微服务升级_SpringCloud Alibaba工作笔记0066
  5. struts获取ajax传值,struts 接收 jquery带参数ajax请求
  6. 《Android应用开发揭秘》读者问题汇总
  7. R中数据结构与数据的输入
  8. reticulate: R interface to Python
  9. 全网首发:OPPO推送:服务器端的参考代码,JAVA版
  10. linux服务之FTP服务篇
  11. 【MySQL数据库】----保姆级MySQL驱动包安装+JDBC编程
  12. 开发Connext DDS传输插件不用求人,看这一篇就够了
  13. 无法启动WORKSTATION服务解决方案
  14. 物联网平台建设调研报告
  15. 中考考试的指令广播_考试语音指令系统
  16. 通用模块系列--日期操作工具类
  17. 旅游行业APP开发方案
  18. 【测试算法】深入浅出Pairwise 算法
  19. Vue和elementUI常用组件问题
  20. 软件测评概要总结-中科软测认证中心

热门文章

  1. 计算机网络华为路由器配置实验,计算机网络 路由器基本命令操作实验报告格式 华为.doc...
  2. 成贤学院谈 东南大学成贤学院
  3. 基于机器学习组合模型的个人信用评估
  4. 怎么修改数组中指定元素_求数组中第K大的元素
  5. win10安装计算器
  6. 一个真正简洁、干净的浏览器主页Speedceo
  7. 才一年,H5的发展就成这样了
  8. 新手学习次世代,需要了解哪些
  9. c语言 时间函数,C语言函数—时间日期函数
  10. VIM使用方法及技巧