开始接触的时候可能大家都会很模糊到底什么是反射,大家都以为这个东西不重要,其实很重要的,几乎所有的框架都要用到反射,增加灵活度。到了后面几乎动不动就要用到反射。

首先我们先来认识一下对象

学生----->抽象----->Student

表示学生   Student = .......

那我们的反射中的Class呢?

类型----->抽象----->Class(反射的入口破)

java.lang.class    表示java中的类型

  Class c = Student.Class

  Class c = int.Class

  Class c =int[].Class

一、反射(Reflection)的概述

1.1、定义

  反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法 对于任意一个对象,都能够调用它的任意一个方法和属性, 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

  即:在"运行时",通过反射机制可以动态获得到和该类型相关的各种信息。    

  java通常是先有类后有对象,有对象就可以调用方法或属性。反射其实是通过Class对象来调用类里面的方法。
  通过反射可以调用私有方法和私有属性。大部分框架都是运用反射原理。

1.2、Class类型     java.lang.Class类

  Class是对java中所有类型的抽象。即一个Class类型对象可以表示出java中任意一种类型。每种类型在加载到内存后,内存中都会生产一个与之对应的Class类型对象(有且只有一个),用来表示该类型。

  每个类型都有且只有一个Class类型对象与之对应,通过这个Class类型对象就可以获得到该类型中的各种信息。Class类是Java反射的入口.。

  1)表示基本类型
              Class c = int.class;
              System.out.println(c.isPrimitive());//true
              System.out.println(c.getName());//int
            
              注:其他基本类型的情况类似
  2)表示类类型
              注:s.getClass()方法返回的是变量s所指向对象的实现类型的Class对象。
              Student s = new Student();
              Class c1 = s.getClass();
              Class c2 = Student.class;
              System.out.println(c1 == c2);//true
            
              //p指向的对象实际类型是Student
              Person p = new Student();
              Class c1 = p.getClass();//c1表示Student类型
              Class c2 = Person.class;//c2表示Person类型
              System.out.println(c1 == c2);//false
  3)表示接口类型
              Action a = new Student();
              Class c1 = a.getClass();//c1表示Student类型
              Class c2 = Action.class;//c2表示Action类型
              System.out.println(c1 == c2);//false
              System.out.println(c2.isInterface());//true
        
  4)表示数组类型
              int[] a = new int[4];
              Class c1 = a.getClass();
              Class c2 = int[].class;
              System.out.println(c1 == c2);//true
              System.out.println(c1.isArray());//true

      Class c3 = c1.getComponentType();//c3表示该数组是使用什么类型声明出来的
              System.out.println(c3.getName());//int
           
              Student[] a = new Student[4];
              Class c1 = a.getClass();
              Class c2 = Student[].class;
              System.out.println(c1 == c2);//true
              System.out.println(c1.isArray());//true

   Class c3 = c1.getComponentType();//c3表示该数组是使用什么类型声明出来的
              System.out.println(c3.getName());//com.briup.test.Student

1.3、获取一个类类型的Class对象的三种方式

  想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到

  我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象。

    1)使用Class类中的forName方法获得

          Class clazz1 = Class.forName("全限定类名");  //通过Class类中的静态方法forName,直接获取到一个类的字节码文件对象,此时该类还是源文件阶段,并没有变为字节码文件。

          这种方法很灵活,只需一个String类型参数即可,而String类型的数据改变起来很容易,注意该方法是会抛出异常。

    2)使用类名获得

        Class clazz2  = Person.class;    //当类被加载成.class文件时,此时Person类变成了.class,在获取该字节码文件对象,也就是获取自己, 该类处于字节码阶段。

    3)使用对象调用getClass方法获得

        Class clazz3 = p.getClass();    //通过类的实例获取该类的字节码文件对象,该类处于创建对象阶段。

          getClass是Object中的final修饰的方法,每个对象都可以调用而且不能重写 

    注:以上三种方法获得的同一个对象(==比较),因为每个类型内存都有且只有一个Class类型对象。

1.4、反射机制中的常见类的含义

  java.lang包下:
    Class  类        对java中所有类型抽象而得来的
    Package类        对java中所有包抽象而得来的

  java.lang.reflect包下:
    Modifier    类    对java中所有修饰符抽象而得来的
    Field        类    对java中所有属性抽象而得来的
    Method        类    对java中所有方法抽象而得来的
    Constructor 类    对java中所有构造器抽象而得来的
    Array        类    提供了对数组对象的动态访问
    ParameterizedType接口  在反射中表示参数化类型
    例如:List<String> Point<Long,Long>等这种带泛型的类型

二、反射机制获取类中的信息

2.1、使用Class类型对象获得类中的信息

  1. 1.获得该类所处的包的信息
  2. Student s = new Student();
  3. Class c = s.getClass();
  4. System.out.println(c.getPackage().getName());
  5.  
  6. 2.获得该类的修饰符信息
  7. //每个修饰符对应一个int值
  8. //如果有多个修饰符则int值相加
  9. Student s = new Student();
  10. Class c = s.getClass();
  11. System.out.println(c.getModifiers());
  12.  
  13. System.out.println(Modifier.PUBLIC);
  14. System.out.println(Modifier.FINAL);
  15.  
  16. 3.获得该类的名字
  17. Student s = new Student();
  18. Class c = s.getClass();
  19. System.out.println(c.getName());
  20.  
  21. 4.获得该类的父类的Class对象
  22. Student s = new Student();
  23. Class c = s.getClass();
  24. //superclass表示其父类型的Class对象
  25. Class superclass = c.getSuperclass();
  26. System.out.println(superclass.getName());
  27.  
  28. 例如:
  29. Class c = Object.class;
  30. Class superclass = c.getSuperclass();
  31. System.out.println(superclass.getName());
  32. //运行报错,因为Object没有父类
  33.  
  34. 例如:
  35. //判断c1是不是c2的子类型
  36. //判断c3是不是c2的子类型
  37. Class c1 = Student.class;
  38. Class c2 = Person.class;
  39. Class c3 = String.class
  40. System.out.println(c2.isAssignableFrom(c1));//true
  41. System.out.println(c2.isAssignableFrom(c3));//false
  42.  
  43. 5.获得该类所实现的接口类型的Class对象
  44. Student s = new Student();
  45. Class c = s.getClass();
  46. Class[] interfaces = c.getInterfaces();
  47. for(Class clazz:interfaces){
  48. System.out.println(clazz.getName());
  49. }
  50.  
  51. 例如:
  52. //判断c1是不是c2的实现类
  53. //判断c3是不是c2的实现类
  54. Class c1 = Student.class;
  55. Class c2 = Action.class;
  56. Class c3 = String.class
  57. System.out.println(c2.isAssignableFrom(c1));//true
  58. System.out.println(c2.isAssignableFrom(c3));//false
  59.  
  60. 6.获得该类中所有的属性
  61. Student s = new Student();
  62. Class c = s.getClass();
  63. Field[] declaredFields = c.getDeclaredFields();
  64.  
  65. for(Field f:declaredFields){
  66. System.out.println(f.getModifiers());
  67. System.out.println(f.getType().getName());
  68. System.out.println(f.getName());
  69. }
  70. 注:
  71. getDeclaredFields()方法返回类中声明的属性,包括私有的
  72. getFields()方法只返回类中public修饰的属性,包括继承的
  73.  
  74. 例如:
  75. //获得某个指定的属性(也包括私有属性)
  76. Student s = new Student();
  77. Class c = s.getClass();
  78. Field f = c.getDeclaredField("score");
  79. System.out.println(f.getModifiers());
  80. System.out.println(f.getType().getName());
  81. System.out.println(f.getName());
  82.  
  83. 7.获得该类中所有的方法
  84. Student s = new Student();
  85. Class c = s.getClass();
  86. Method[] declaredMethods = c.getDeclaredMethods();
  87. for(Method m:declaredMethods){
  88. System.out.println(m.getModifiers());
  89. System.out.println(m.getReturnType().getName());
  90. System.out.println(m.getName());
  91. System.out.println(Arrays.toString(m.getParameterTypes()));
  92. System.out.println(Arrays.toString(m.getExceptionTypes()));
  93. }
  94.  
  95. 注:
  96. getDeclaredMethods()方法返回类中声明的方法,包括私有的
  97. getMethods()方法只返回类中public修饰的方法,包括继承的
  98.  
  99. 例如:
  100. //获得某个指定的方法(也包括私有方法)
  101. Student s = new Student();
  102. Class c = s.getClass();
  103. Method m = c.getDeclaredMethod("print");
  104. System.out.println(m.getModifiers());
  105. System.out.println(m.getReturnType().getName());
  106. System.out.println(m.getName());
  107. System.out.println(Arrays.toString(m.getParameterTypes()));
  108. System.out.println(Arrays.toString(m.getExceptionTypes()));
  109.  
  110. 8.获得该类中所有的构造器
  111. Student s = new Student();
  112. Class c = s.getClass();
  113. Constructor[] declaredConstructors = c.getDeclaredConstructors();
  114. for(Constructor con:declaredConstructors){
  115. System.out.println(con.getModifiers());
  116. System.out.println(con.getName());
  117. System.out.println(Arrays.toString(con.getParameterTypes()));
  118. System.out.println(Arrays.toString(con.getExceptionTypes()));
  119. }
  120.  
  121. 注:
  122. getDeclaredConstructors()方法返回类中所有构造器
  123. getConstructors()方法只返回类中public修饰的构造器
  124.  
  125. 例如:
  126. //获得某个指定的构造器(也包括私有构造器)
  127. Student s = new Student();
  128. Class c = s.getClass();
  129. Constructor con = c.getDeclaredConstructor(double.class);
  130. System.out.println(con.getModifiers());
  131. System.out.println(con.getName());
  132. System.out.println(Arrays.toString(con.getParameterTypes()));
  133. System.out.println(Arrays.toString(con.getExceptionTypes()));
  134.  
  135. 9.获得父类型中的泛型的真实类型
  136. 因为泛型类的泛型参数在编译期会被擦除,所以我们不能再运行期间直接拿到该泛型的实际类型,但是可以通过子类的Class对象来获取父类的泛型类型。
  137.  
  138. 例如: 不通过子类不能获得泛型实际类型
  139. public class GenericTest<T,S>{
  140. public T name;
  141. public S say(T t,S s){
  142. return s;
  143. }
  144. }
  145.  
  146. main:
  147. GenericTest<String,Integer> t = new GenericTest<String,Integer>();
  148. Class c = t.getClass();
  149. Field field = c.getDeclaredField("name");
  150. System.out.println(field.getType());
  151. System.out.println(field.getGenericType());
  152. //输出结果:
  153. class java.lang.Object
  154. T
  155.  
  156. System.out.println("-------------------------");
  157. Method method = c.getMethod("say", Object.class,Object.class);
  158. System.out.println(method.getReturnType());
  159. System.out.println(method.getGenericReturnType());
  160. //输出结果:
  161. class java.lang.Object
  162. S
  163.  
  164. System.out.println("-------------------------");
  165. System.out.println(Arrays.toString(method.getParameterTypes()));
  166. System.out.println(Arrays.toString(method.getGenericParameterTypes()));
  167. //输出结果:
  168. [class java.lang.Object, class java.lang.Object]
  169. [T, S]
  170.  
  171. 例如: 通过子类可以获得父类中泛型的实际类型
  172. public class GenericTest<T,S>{
  173. public T name;
  174. public S say(T t,S s){
  175. return s;
  176. }
  177. }
  178. public class Sub entends GenericTest<String,Integer>{}
  179.  
  180. main:
  181. Class c = Sub.class;
  182.  
  183. //获得父类类型,包含泛型参数信息
  184. Type superType = c.getGenericSuperclass();
  185.  
  186. //判断父类类型是不是属于ParameterizedType类型
  187. //ParameterizedType表示带泛型的类型
  188. if(superType instanceof ParameterizedType){
  189. //强转,并调用方法获得泛型参数的实例类型
  190. ParameterizedType pt = (ParameterizedType)superType;
  191.  
  192. Type[] actualTypeArguments = pt.getActualTypeArguments();
  193.  
  194. //循环遍历,并强转为Class类型,因为Type接口中没有任何方法
  195. for(Type t:actualTypeArguments){
  196. Class clazz = (Class)t;
  197. System.out.println(clazz.getName());
  198. }
  199. }
  200.  
  201. 例如: 通过子类可以获得实现接口中泛型的实际类型
  202. Class c = Sub.class;
  203. Type[] types = c.getGenericInterfaces();
  204. for(Type t:types){
  205. if(t instanceof ParameterizedType){
  206. ParameterizedType pt = (ParameterizedType)t;
  207.  
  208. Type[] actualTypeArguments = pt.getActualTypeArguments();
  209.  
  210. for(Type type:actualTypeArguments){
  211. Class clazz = (Class)type;
  212. System.out.println(clazz.getName());
  213. }
  214.  
  215. }
  216. }
  217.  
  218. 10.获得类中的注解
  219. 使用反射也可以获得类中的注解.(在之后的内容在来了解)

Class类型获取对象类中信息

2.2、反射的常用操作

  1. public class Student{
  2. private long id;
  3. private String name;
  4.  
  5. private static int age;
  6.  
  7. get/set
  8.  
  9. public static void say(){
  10. System.out.println("say..");
  11. }

  1)使用反射的方式调用构造器创建类的对象

    默认方式:必须调用无参构造器
        Class c = Student.class;
        Student s = (Student)c.newInstance();

     通用方式:获得构造器对象,并调用该构造器

     注:getConstructor方法和newInstance方法的参数都是可变参数
                例如:获得无参构造器并调用创建对象
                Class c = Student.class;
                Constructor constructor = c.getConstructor();
                Student o = (Student)constructor.newInstance();
                System.out.println(o);

     例如:获得有参构造器并调用创建对象
                Class c = Student.class;
                Constructor constructor = c.getConstructor(long.class,String.class);
                Student o = (Student)constructor.newInstance(1L,"tom");
                System.out.println(o);

  2)使用反射的方式访问对象中的属性
                例如:
                Student s = new Student();
                Class c = s.getClass();
                Field[] declaredFields = c.getDeclaredFields();
                for(Field f:declaredFields){

      //设置私有属性可以被访问
                    f.setAccessible(true);

      //判断属性是否为static,静态属性的访问不需要对象
                    if(Modifier.isStatic(f.getModifiers())){
                        System.out.println(f.getName() +" = "+f.get(null));
                    }else{
                        System.out.println(f.getName() +" = "+f.get(s));
                    }
                }

     注:Field类中的get方法可以获得属性值,set方法可以给属性设置值。
     
  3)使用反射的方式调用对象中的方法
                例如:
                Student s = new Student();
                Class c = s.getClass();
            
                Method m1 = c.getMethod("setName",String.class);
                //m1表示Student中的setName方法
                //调用对象s中的m1方法,并且传参"tom"
                //s.setName("tom");
                m1.invoke(s, "tom");
            
                Method m2 = c.getMethod("getName");
                String name = (String)m2.invoke(s);
                System.out.println("name = "+name);
            
                //调用静态方法 不需要对象
                Method m3 = c.getMethod("say");
                m3.invoke(null);

  4)使用反射的方式动态操作数组
                注:
                Object[] o1 = new int[1];//编译报错
                long[]      o2 = new int[1];//编译报错
                int[]     o3 = new int[1];//编译通过
            
                Object[] o1 = new 任意引用类型[1];//编译通过

     例如:

  1. //要求:传任意类型"数组",把数组长度扩大1倍并返回
  2.      //注意这里不能收Object[],
  3.      //因为Object[] o = new Integer[4];编译通过
  4.      //但是Object[] o = new int[4]; 编译报错
  5.      //那么使用Object类中就可以接收任意类型的数组了
  6.      public static Object arrayCopy(Object obj){
  7.      //代码
  8.      }
  9.  
  10.      实现:
  11.      public static Object arrayCopy(Object obj){
  12.      Class c = obj.getClass();
  13.     Object newArray = null;
  14.      if(c.isArray()){
  15.      int len = Array.getLength(obj);
  16.      Class<?> type = c.getComponentType();
  17.      newArray = Array.newInstance(type, len*2);
  18.      for(int i=0;i<len;i++){
  19.      Object value = Array.get(obj, i);
  20.      Array.set(newArray, i, value);
  21.      }
  22.      }
  23.      return newArray;
  24.      } 

数组长度扩大一倍

三、Class的API详解

3.1、通过字节码对象创建实例对象

         

3.2、获取指定构造器方法

  constructor 如果没有无参构造,只有有参构造如何创建实例呢?看下面

         

  总结上面创建实例对象:Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的构造函数, 就不能这样创建了,可以调用Class类的getConstructor(String.class,int.class)方法

    取一个指定的构造函数然后再调用Constructor类的newInstance("张三",20)方法创建对象

  获取全部构造方法  

              

3.3、获取成员变量并使用 

  Field对象

    获取指定成员变量

          

         Class.getField(String)方法可以获取类中的指定字段(可见的), 如果是私有的可以用getDeclaedField("name")方法获取,通过set(obj, "李四")方法可以设置指定对象上该字段的值,

          如果是私有的需要先调用setAccessible(true)设置访问权限,用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值

    获取全部成员变量

        

3.4、获得方法并使用 

           Method

          

        Class.getMethod(String, Class...) 和 Class.getDeclaredMethod(String, Class...)方法可以获取类中的指定方法,    

          如果为私有方法,则需要打开一个权限。setAccessible(true);

        用invoke(Object, Object...)可以调用该方法,

        跟上面同理,也能一次性获得所有的方法

                      

3.5、获得该类的所有接口

  Class[] getInterfaces():确定此对象所表示的类或接口实现的接口

  返回值:接口的字节码文件对象的数组

3.6、获取指定资源的输入流

  InputStream getResourceAsStream(String name)  

  return:一个 InputStream 对象;如果找不到带有该名称的资源,则返回 null

  参数:所需资源的名称,如果以"/"开始,则绝对资源名为"/"后面的一部分。

四、两个实例来全面了解反射

实例1:

  1. package corejava.test;
  2.  
  3. import java.lang.reflect.Array;
  4. import java.lang.reflect.Constructor;
  5.  
  6. class A{
  7. private int id;
  8. private String name="Tom";
  9. private A(int a,String name){
  10. id=a;
  11. }
  12. @Override
  13. public String toString() {
  14. return "A [id=" + id + ", name=" + name + "]";
  15. }
  16. }
  17.  
  18. public class Test1 {
  19.  
  20. public static Object createObject(String classname) throws Exception {
  21. Class<?> name = Class.forName(classname);
  22. return createObject(name);
  23. }
  24. public static Object createObject(Class<?>c) throws Exception{
  25. Object object=null;
  26. try {
  27. object=c.newInstance();
  28. } catch (InstantiationException e) {
  29. // 如果此 Class 表示一个抽象类、接口、数组类、基本类型或 void;
  30. // 或者该类没有 null 构造方法; 或者由于其他某种原因导致实例化失败。
  31.  
  32. // 2、数组类、基本类型 能够创建对象
  33.  
  34. if(c.isArray()){
  35. object=Array.newInstance(c.getComponentType(),);
  36. }
  37. else if(c.isPrimitive()){
  38.  
  39. if(c == boolean.class){
  40. object=false;
  41. }else if(c==void.class){
  42. throw new Exception(c.getName()+"不能创建对象!");
  43. }else {
  44. object=;
  45. }
  46. }else {
  47. // 3、没有 null 构造方法
  48.  
  49. Constructor<?>[] constructors = c.getConstructors();
  50.  
  51. if(constructors.length==) throw new Exception(c.getName()+"没有Public构造器!");
  52.  
  53. Class<?>[] parameterTypes = constructors[].getParameterTypes();
  54. Object[] parameters=new Object[parameterTypes.length];
  55. for(int i=;i<parameters.length;i++){
  56. parameters[i]=createObject(parameterTypes[i]);
  57. }
  58. object=constructors[].newInstance(parameters);
  59. }
  60. // 1、其他某种原因、void、抽象类、接口时抛出异常
  61. if(object==null)throw new Exception(c.getName()+"不能创建对象!");
  62. }
  63. return object;
  64. }
  65. public static void main(String[] args) throws Exception {
  66.  
  67. System.out.println(createObject(A.class));
  68. System.out.println("ssss");
  69. // System.out.println(new String());
  70. // System.out.println("ssss");
  71. }
  72.  
  73. }

实例1

实例2:

  1. package corejava.test;
  2.  
  3. import java.lang.reflect.Constructor;
  4. import java.lang.reflect.Field;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.Modifier;
  7. import java.lang.reflect.Parameter;
  8. import java.nio.file.spi.FileSystemProvider;
  9.  
  10. import static java.lang.System.out;
  11.  
  12. final class B{
  13. private int id;
  14. private String name="Tom";
  15. private static String mm="Tom";
  16. private B(int a,String name){
  17. id=a;
  18. }
  19. @Override
  20. public String toString() {
  21. return "B [id=" + id + ", name=" + name + "]";
  22. }
  23. public int f(String name,A a){
  24. return id;}
  25. }
  26. public class Test2 {
  27.  
  28. public static void printClass(Class<?> c) throws Exception{
  29. //1、包名;
  30. out.println(c.getPackage()+";");
  31. //2、修饰符 +class+类名{
  32. out.println(Modifier.toString(c.getModifiers())+
  33. " class "+c.getSimpleName()+" {");
  34.  
  35. //3、修饰符 +属性类型+属性名;
  36. for(Field f:c.getDeclaredFields()){
  37. out.print("\t"+Modifier.toString(f.getModifiers())+
  38. " "+f.getType().getSimpleName()+" "+f.getName());
  39. f.setAccessible(true);
  40. if(Modifier.isStatic(f.getModifiers()))
  41. out.print(" = "+f.get(null));
  42. out.println(";");
  43. }
  44.  
  45. //4、修饰符 +类名+( 参数类型+参数名字){ }
  46. for(Constructor<?> constructor:c.getDeclaredConstructors()){
  47. out.print("\t"+Modifier.toString(constructor.getModifiers())+" "+
  48. c.getSimpleName()+"(");
  49.  
  50. Parameter[] ps = constructor.getParameters();
  51. for(int i=;i<ps.length;i++){
  52. out.print(ps[i].getType().getSimpleName()+" "
  53. +ps[i].getName());
  54. if(i<ps.length-)out.print(",");
  55. }
  56. out.println("){}");
  57. }
  58. out.println();
  59. //5、修饰符 +返回类型+方法名++( 参数类型+参数名字){ }
  60. for(Method m:c.getDeclaredMethods()){
  61. out.print("\t"+Modifier.toString(m.getModifiers())+" "+
  62. m.getReturnType().getSimpleName()+" "+
  63. m.getName()+"(");
  64.  
  65. Parameter[] ps = m.getParameters();
  66. for(int i=;i<ps.length;i++){
  67. out.print(ps[i].getType().getSimpleName()+" "
  68. +ps[i].getName());
  69. if(i<ps.length-)out.print(",");
  70. }
  71. out.println("){}");
  72. out.println();
  73. }
  74. //6、}
  75. out.println("}");
  76.  
  77. }
  78. public static void main(String[] args) throws Exception {
  79. printClass(Object.class);
  80. }
  81.  
  82. }

实例2

觉得不错的“点个推荐”哦!

JavaSE(十)之反射的更多相关文章

  1. JAVASE(十八) 反射: Class的获取、ClassLoader、反射的应用、动态代理

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.反射(JAVA Reflection)的理解 1.1 什么是反射(JAVA Reflection) ...

  2. 《Inside C#》笔记(十四) 反射

    通过反射可以在运行时动态地获取一个应用的元数据. 一 反射相关的类和方法 与反射相关的类处在System.Reflection命名空间下,包括Assembly.Module.MethodInfo.Fi ...

  3. javase高级技术 - 反射

    在说反射之前,必须得先说说java的类加载器,类加载器的定义:将.class文件加载到内在中,并为之生成对应的Class对象. 一般有三种 1 Bootstrap ClassLoader 根类加载器也 ...

  4. JAVASE(十六) IO流 :File类、节点流、缓冲流、转换流、编码集、对象流

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.File类型 1.1.File类的理解 File类是在java.io包下 File可以理解成一个文件 ...

  5. JAVASE(十五) 泛型 :泛型用例、自定义泛型类、通配符

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.泛型在集合中的使用 1.1 在集合中使用泛型之前的例子 ​ 为什么要有泛型(Generic)? 1. ...

  6. JAVASE(十四) 集合: 数组和集合、Collection、Iterator、List、Set、Map

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.数组和集合 1.1 内存中对数据进行存储和管理的“容器”:数组,集合 1.2 数组存储的特点和缺点 ...

  7. JAVASE(十二) Java常用类: 包装类、String类、StringBuffer类、时间日期API、其他类

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.包装类 1 .1 八个包装类 ​ 1. 2 基本数据类型,包装类,String者之间的转换 ​ 2. ...

  8. JAVASE(十)面向对象:特性之多态性、Object类、代码块、关键字:static、final、父子类执行顺序

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.面向对象的特性之:多态性 多态性的理解:事物的多种形态 1.1 广义上多态性的体现:①方法的重写,重 ...

  9. JavaSE核心知识

    一:Java简介 1. Java语言的介绍:Java是一门面向对象编程语言,具有功能强大和简单易用两个特征. 2. Java语言的特点:简单性.面向对象.分布式.健壮性.安全性.平台独立与可移植性.多 ...

  10. C#反射与特性(一):反射基础

    目录 C#反射与特性(一):反射基础 1. 说明 1.1 关于反射.特性 2. 程序集操作 2.1 获取 程序集对象(Assembly) 2.2 Assembly 使用 2.3 获取程序集的方式 C# ...

随机推荐

  1. nginx中配置404错误页面的教程

    什么是404页面如果网站出了问题,或者用户试图访问一个并不存在的页面时,此时服务器会返回代码为404的错误信息,此时对应页面就是404页面.404页面的默认内容和具体的服务器有关.如果后台用的是NGI ...

  2. LNMP zabbix安装

    LNMP一键安装 zabbix安装          zabbix安装图文介绍 zabbix连接数据库失败(connection to database 'zabbix' failed: [1045] ...

  3. 黑客编程教程(六)Windows的关机和重起

    第六节 Windows的关机和重起 很多木马都有远程关机功能,但这并不是一个很好的功能.不过对于入侵服务器,有时需要重起服务器.其实对于关机和重起,只需要调用几个 API函数即可实现. 对于WIN9X ...

  4. Ubuntu C/C++开发环境的安装和配置

    安装ubantu会自动安装GCC,但是这个GCC什么文件都不能编译,因为没有一些必须的头文件,所以要安装build-essential这个软件包,安装了这个包会自动安装上g++,libc6-dev,l ...

  5. Map Class Example

    Here's a quick look at how to use the Scala Map class, with a colllection of Map class examples. The ...

  6. HttpClient 教程 (五)

    第五章 HTTP客户端服务 5.1 HttpClient门面 HttpClient接口代表了最重要的HTTP请求执行的契约.它没有在请求执行处理上强加限制或特殊细节,而在连接管理,状态管理,认证和处理 ...

  7. Ubuntu下如何解压缩zip,tar,tar.gz,tar.bz2文件

    转自:http://wangli-5665.diandian.com/post/2011-08-18/4039228 这么多年来,数据压缩对我们来说是非常有用的.无论是在邮件中发送的图片用的zip文件 ...

  8. asp.net mvc 5 在没有外网win2008R2服务器部署方法

    我在本地用最新的.net 4.5和asp.net mvc 5框架做了一个小应用.本地都测试打包成功. 现在要放到服务器上,这个应用只是内网用.服务器不允许连接外网.看到www.asp.net 没有mv ...

  9. Rokid开发者社区skill之【历史上的今天】

    技能名称:历史上的今天 入口词:打开历史上的今天 语音交互:(有些是先写上) { "intents": [ { "intent": "PAUSE_HI ...

  10. addEventListener()绑定事件的对象方法。

    addEventListener()绑定事件的对象方法.addEventListener()含有三个参数,一个是事件名称,另一个是事件执行的函数,最后一个是事件捕获,, obj.addEventLis ...