• 温故知新


    1、Servlet生命周期

      ①、初始化阶段,调用init()方法

      ②、响应客户请求阶段,调用service()方法。由service()方法根据提交方式选择执行doGet()方法还是doPost()方法

      ③、终止阶段,调用destory()方法

    2、Servlet容器装载Servlet的几种情况

      1、Servlet容器启动时自动装载Servlet,实现只需要在web.xml文件中<Servlet></Servlet>间加入<loadon-startup>1</loadon-startup>,数字越小表示优先级越高

      2、客户首次向Servlet发送请求

      3、Servlet类文件被更新后,重新装载Servlet

    3、Servlet与九大内置对象

      

    4、Servlet高级

      获取初始化参数

        在web.xml中配置Servlet,可配置一些初始化参数。而在Servlet中可通过ServletConfig接口提供的方法获取这些参数

          <init-param>
          <param-name>username</param-name>
          <param-value>admin</param-value>
          </init-param>
          <init-param>
          <param-name>password</param-name>
          <param-value>123456</param-value>
          </init-param>

       使用this.getInitParameter("username")获取参数

    —————————————————————————————————————————————————————————————————————————————————

    Java---反射

    1、Class类的使用

      类是对象,类是java.lang.Class类的实例对象

     1 public class ClassDemo {
     2     public static void main(String[] args) {
     3         // Foo的实例对象表示
     4         Foo foo = new Foo();
     5         
     6         // Foo类 也是一个实例对象
     7         // 任何一个类都是Class的实例对象,这个实例对象有三种表示方式
     8         
     9         // 第一种方式---实际表示任何一个类都有一个隐含的静态成员变量
    10         Class c1 = Foo.class;
    11         
    12         // 第二种方式---已知该类的对象通过getClass方法获取
    13         Class c2 = foo.getClass();
    14         
    15         // 第三种方式---直接通过forName
    16         Class c3 = null;
    17         try {
    18             c3 = Class.forName("com.Foo");
    19         } catch (ClassNotFoundException e) {
    20             e.printStackTrace();
    21         }
    22 
    23         // 官网 c1/c2/c3 表示Foo类的类类型(class type)      c1==c2==c3
    24         // 可以使用 c1/c2/c3 创建该类的对象实例
    25         try {
    26             // 需要有无参数的构造方法
    27             Foo foo1 = (Foo) c1.newInstance();
    28             Foo foo2 = (Foo) c2.newInstance();
    29             Foo foo3 = (Foo) c3.newInstance();
    30             foo1.print();
    31             foo2.print();
    32             foo3.print();
    33         } catch (InstantiationException e) {
    34             e.printStackTrace();
    35         } catch (IllegalAccessException e) {
    36             e.printStackTrace();
    37         }
    38     }
    39 }
    40 class Foo{
    41     void print(){ System.out.println("Foo类对象"); }
    42 }

    2、动态加载类

      编译时刻加载类是静态加载类  ——  运行时刻加载类是动态加载类

        编译时刻和运行时刻的区别:

          new 创建对象 是静态加载类,在编译时刻就需要加载所有的可能使用到的类(通过动态加载类可以解决)

          Class c = Class.forName("com.class");  是动态加载类,通过类类型创建对象(Object  obj  =  (Object)c.newInstance;)

    3、方法的反射

     1 public class ClassDemo {
     2     public static void main(String[] args) {
     3 
     4         Class c1 = int.class;   // int
     5         Class c2 = String.class;
     6         Class c3 = double.class;
     7         Class c4 = Double.class;
     8         Class c5 = void.class;
     9 
    10         System.out.println(c1.getName());   // 输出int
    11         System.out.println(c2.getName());   // 输出java.lang.String
    12         System.out.println(c2.getSimpleName());// 输出String  不包含包名的类的名称
    13         System.out.println(c5.getName());   // 输出void
    14 
    15     }
    16 }

      获取方法的信息

     1 public class ClassUtil {
     2     /*
     3       打印类的信息,成员函数
     4     * @param  obj 该对象所属类的信息
     5     * */
     6     public static void printClassMethodMessage(Object object) {
     7         // 要获取类的信息  首先要获取类的类类型
     8         Class c = object.getClass();    // 传递的是哪个子类的对象,c就是该子类的类类型
     9 
    10         // 获取类名称
    11         System.out.println("类名:" + c.getName());
    12         /*
    13         * Method类,方法对象
    14         * 一个成员方法就是一个Method对象
    15         * getMethod()方法获取的是所有的public函数,包括父类继承而来的
    16         * getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
    17         * */
    18         Method[] ms = c.getMethods(); // c.getDeclaredMethods()
    19         for (int i=0; i<ms.length; i++){
    20             // 得到方法的返回值类型的类类型
    21             Class resultType = ms[i].getReturnType();
    22             System.out.println(resultType.getName() + " ");
    23             // 得到方法的名称
    24             System.out.println(ms[i].getName()+"(");
    25             // 获取参数类型--->得到参数列表的类型的类类型
    26             Class[] paramTypes = ms[i].getParameterTypes();
    27             for (Class class1 : paramTypes){
    28                 System.out.println(class1.getName()+",");
    29             }
    30             System.out.println(")");
    31         }
    32     }
    33 }
    34 
    35 public class Classdemo{
    36     public static void main(String[] args) {
    37         String s = "hello";
    38         ClassUtil.printClassMethodMessage(s);
    39     }
    40 }

      1)如何获取某个方法

        方法的名称和方法的参数列表才能唯一决定某个方法

      2)方法反射的操作

        method.invoke(对象, 参数列表)

     1 public class MethodDemo {
     2     public static void main(String[] args) {
     3         // 要获取print(int, int)方法, 1、要获取一个方法就是获取类的信息,获取类的信息首先要获取类的类类型
     4         A a1 = new A();
     5         Class c = a1.getClass();
     6         // 2、获取方法  名称和参数列表来决定
     7         // getMethod获取的是public的方法
     8         // getDeclaredMethod
     9         try {
    10             //  Method m = c.getMethod("print", new Class[]{int.class, int.class});
    11             Method m = c.getMethod("print", int.class,int.class);
    12             Method m1 = c.getMethod("print", String.class, String.class);
    13             Method m2 = c.getMethod("print");
    14             // 方法的反射操作  方法如果没有返回值返回null,有返回值返回具体的返回值
    15             m.invoke(a1, 10, 20);
    16             m1.invoke(a1, "hello","WORLD");
    17             m2.invoke(a1 , new Object[]{});
    18         } catch (Exception e) {
    19             e.printStackTrace();
    20         }
    21     }
    22 }
    23 
    24 public class A{
    25     public void print(){
    26         System.out.println("helloWorld!!!");
    27     }
    28 
    29     public void print(int a, int b){
    30         System.out.println(a+b);
    31     }
    32 
    33     public void print(String a, String b){
    34         System.out.println(a.toUpperCase() + "," +b.toLowerCase());
    35     }
    36 }

    4、成员变量的反射

      获取成员变量的信息

     1 public class ClassUtil {
     2     /*
     3       打印类的信息,成员变量
     4     * @param  obj 该对象所属类的信息
     5     * */
     6     public static void printClassFieldMessage(Object object) {
     7         // 要获取类的信息  首先要获取类的类类型
     8         Class c = object.getClass();    // 传递的是哪个子类的对象,c就是该子类的类类型
     9 
    10         // 获取类名称
    11         System.out.println("类名:" + c.getName());
    12         /*
    13             *  成员变量也是对象
    14             *  java.lang.reflect.Field
    15             *  Field类封装了关于成员变量的操作
    16             *  getField方法获取的是所有的public的成员变量信息
    17             *  getDeclaredFields获取的是该类自己声明的成员变量的信息
    18             * */
    19             /*Field[] fs = c.getFields();*/
    20         Field[] fs = c.getDeclaredFields();
    21         for (Field field : fs){
    22             // 得到成员变量的类型的类类型
    23             Class fieldType = field.getType();
    24             String typeName = fieldType.getName();
    25             // 得到成员变量的名称
    26             String fieldName = field.getName();
    27             System.out.println(typeName+" "+fieldName);
    28         }
    29     }
    30 }
    31 
    32 public class Classdemo{
    33     public static void main(String[] args) {
    34         Integer n = 1;
    35         ClassUtil.printClassFieldMessage(n);
    36     }
    37 }

    5、构造函数的反射

      获取构造函数信息

     1 public class ClassUtil {
     2     /*
     3       打印对象的构造函数的信息
     4     * */
     5     public static void printConMessage(Object object) {
     6         Class c = object.getClass();
     7 
     8         /*
     9         * 构造函数也是对象
    10         * java.lang.Constructor中封装了构造函数的信息
    11         * getConstructors获取所有的public的构造函数
    12         * getDeclaredConstructors得到所有构造函数
    13         * */
    14         /*Constructor[] ss = c.getConstructors();*/
    15         Constructor[] ss = c.getDeclaredConstructors();
    16         for (Constructor constructor : ss){
    17             System.out.println(constructor.getName() + "(");
    18             // 获取构造函数的参数列表--->得到的是参数列表的类类型
    19             Class[] paramTypes = constructor.getParameterTypes();
    20             for (Class class1 : paramTypes){
    21                 System.out.println(class1.getName() + ",");
    22             }
    23         }
    24     }
    25 }
    26 
    27 public class ClassDemos{
    28     public static void main(String[] args) {
    29         ClassUtil.printConMessage("hello");
    30         ClassUtil.printConMessage(new Integer(1));
    31     }
    32 }

    6、通过反射了解集合泛型的本质

     1 public class MethodDemo {
     2     public static void main(String[] args) {
     3         ArrayList arrayList = new ArrayList();
     4         ArrayList<String> arrayList1 = new ArrayList<String>();
     5         arrayList1.add("hello");
     6         Class c1 = arrayList.getClass();
     7         Class c2 = arrayList1.getClass();
     8         System.out.println(c1 == c2);   // true
     9         /*   反射的操作都是编译后的操作   */
    10 
    11         /*
    12         * c1==c2返回true说明编译之后集合的泛型是去泛型化的
    13         * Java中集合的泛型是防止错误输入的,只在编译阶段有效,
    14         * 绕过编译就无效了
    15         * 验证:可以通过方法的反射来操作,绕过编译
    16         * */
    17         try {
    18             Method m = c2.getMethod("add", Object.class);
    19             m.invoke(arrayList1, 20);
    20             System.out.println(arrayList1.size());
    21             System.out.println(arrayList1);
    22         } catch (Exception e) {
    23             e.printStackTrace();
    24         }
    25     }
    26 }
  • 相关阅读:
    Linux守护进程
    sequel pro无法连接mysql服务器
    socket编程之并发回射服务器2
    Unix的I/O模型
    nginx.conf laravel 配置
    phpstudy使用PHP+nginx配置Laravel
    nginx配置文件分开配置
    centos安装composer
    linux下 设置php的环境变量 php: command not found
    laravel 安装
  • 原文地址:https://www.cnblogs.com/ytlds/p/8409691.html
Copyright © 2020-2023  润新知