网络程序,难点在线程

  • 反射 reflect
  • 实用 类对象 来执行反射操作
    • 反射获得一个类的定义信息
    • 反射创建对象
    • 反射调用成员变量, 方法
  • 方法
    • 获得类对象的三种方式
    • A.class
    • Class.forName("完整类名");
    • a1.getClass();
  • 类对象的方法
    • c.getPackage().getName();
    • c.getName();
    • c.getSimpleName();
    • 获得成员变量的定义信息
      • getFields();    得到可见的成员变量,即能访问的, 包括继承来的
      • getDeclaredFields(); 本类定义的所有变量, 包括私有变量, 不包括继承的
      • getField(变量名);  得到单个可见的的成员变量
      • getDeclaredField(变量名);
    • 获得构造方法的定义信息
      • getConstructors();  获得可见的构造方法,
      • getDeclaredConstructors(); 获得所有的构造方法
      • getConstructor(参数类型列表); 获得单个可见的的构造方法
      • getDeclaredConstructor(int.class,String.class);
    • 获得方法的定义信息
      • getMethods(); // 可见的方法, 包括继承的方法
      • getDeclaredMethods(); // 本类定义的方法, 包括私有的方法,不包括继承的方法
      • getMethod(方法名,参数类型列表);
      • getDeclaredMethod(方法名,int.class,String.class);
    • package day1901_反射;
      
      import java.lang.reflect.Constructor;
      import java.lang.reflect.Field;
      import java.lang.reflect.Method;
      import java.util.Arrays;
      import java.util.Scanner; public class Test1 {
      public static void main(String[] args) throws Exception { System.out.println("输入完整类名"); String s = new Scanner(System.in).nextLine(); // 获得这个类的'类对象' Class<?> c = Class.forName(s); // 获得包名, 类名 ,简写类名
      String p = c.getPackage().getName();
      String n = c.getName();
      String sn = c.getSimpleName();
      System.out.println(p);
      System.out.println(n);
      System.out.println(sn); System.out.println("----成员变量------");
      f1(c); System.out.println("----构造方法------");
      f2(c); System.out.println("----方法------");
      f3(c); } private static void f3(Class<?> c) {
      /*
      * Method 对象, 封装方法的定义信息
      * public static void f(int i , String s)throws X,Y,Z
      */
      Method[] a = c.getDeclaredMethods();
      for (Method f : a) {
      String n = f.getName();
      // 构造方法参数的类型 (int.class, String.class);
      Class<?>[] p = f.getParameterTypes();
      System.out.println(n+"("+Arrays.toString(p)+")");
      }
      } private static void f2(Class<?> c) {
      /*
      * Constructor 构造方法的封装对象
      *
      * public A(int a, String s) throws X,Y,Z
      *
      */
      Constructor<?>[] a = c.getConstructors();
      for (Constructor<?> t : a) {
      String n = c.getSimpleName();
      // 构造方法参数的类型 (int.class, String.class);
      Class<?>[] p = t.getParameterTypes();
      System.out.println(n+"("+Arrays.toString(p)+")");
      }
      } private static void f1(Class<?> c) {
      /*
      * Field对象
      * 封装了成员变量的定义信息
      *
      */
      Field[] a = c.getDeclaredFields();
      for (Field f : a) { System.out.println(f.getType().getSimpleName()+f.getName());
      } }
      }
  • 反射新建对象
    • 通过  类对象  的反射操作
    • 执行 无参构造 方法
      • object obj = c.newInstabce();
    • 执行有参构造
      • 先获得构造方法
      • Constructor  t = c.getConstructor(int.class,String.class);
      • 通过构造方法的反射操作, 来新建对象
      • object obj = t.newInstance(int ,String);
    • package day1901_反射;
      
      import java.lang.reflect.Constructor;
      import java.util.Scanner; public class Test2 {
      public static void main(String[] args) throws Exception { System.out.println("输入类名");
      String s = new Scanner(System.in).nextLine();
      Class<?> c = Class.forName(s);
      Object o1 = null;
      Object o2 = null; /*
      * 新建 o1,执行无参构造
      * 新建 o2,执行有参构造
      */ try {
      o1 = c.newInstance();
      System.out.println("o1:"+o1);// 默认执行 o1 的toString
      } catch (Exception e) {
      // TODO: handle exception
      System.out.println("o1: 不能执行无参构造");
      } System.out.println("-----------------------------"); try {
      Constructor<?> t = c.getConstructor(int.class);
      o2 = t.newInstance();
      System.out.println("o2: "+o2);
      } catch (Exception e) {
      // TODO: handle exception
      System.out.println("o2: 不能执行int参数构造方法");
      } }
      }
  • 反射调用成员变量,
    • 获得成员变量
    • Field f = c.getDeclaredField("age");
    • 使私有变量也可以访问,
    • f.setAccssible(true);
    • 赋值
    • f.set(对象,21);给指定对象的变量赋值
    • 取值
    •  int i = (int)f.get(对象);
    • package day1901_反射;
      
      import java.lang.reflect.Field;
      
      import day0802.Student;
      
      /*
      * 跨项目不能直接访问,需要项目关联
      * 左侧选中需要关联项目的项目,右键弹出选中build path 选中项目project,
      */
      public class Test3 {
      public static void main(String[] args) throws Exception, SecurityException { //
      Student s = new Student();
      Class<Student> c = Student.class; // 获得age变量 并赋值
      Field f = c.getDeclaredField("age"); f.setAccessible(true); f.set(s, ); System.out.println(s.getAge()); int a = (int)f.get(s);
      System.out.println(a);
      }
      }
  • 反射调用成员方法

    • 获得方法
    •  Method t =  c.getMethod(方法名,参数类型列表);
    • 使得私有方法允许被调用
    • t.setAccessible(true);
    • 调用方法
    • t.invoke(对象,参数数据);
      • 让指定对象,执行该方法
      • 静态方法,第一个参数传 null
      • 没有返回值得到 null
    • package day1901_反射;
      
      import java.lang.reflect.Field;
      import java.lang.reflect.Method; import day0802.Student; /*
      * 跨项目不能直接访问,需要项目关联
      * 左侧选中需要关联项目的项目,右键弹出选中build path 选中项目project,
      */
      public class Test3 {
      public static void main(String[] args) throws Exception, SecurityException { //
      Student s = new Student();
      Class<Student> c = Student.class; // 获得age变量 并赋值
      Field f = c.getDeclaredField("age"); f.setAccessible(true); f.set(s, ); System.out.println(s.getAge()); int a = (int)f.get(s);
      System.out.println(a); // 反射测试方法
      Method gg = c.getMethod("getGender"); Method sg = c.getMethod("setGender", String.class); sg.invoke(s, "男");
      Object r = gg.invoke(s); System.out.println(r); }
      }
    • 反射的测试应用
    • package day1901_反射;
      
      import java.io.BufferedReader;
      import java.io.FileInputStream;
      import java.io.InputStreamReader;
      import java.lang.reflect.Method;
      import java.util.ArrayList; public class Runner { private static ArrayList<String> list =
      new ArrayList<String>(); // 静态初始化快
      static {
      try { BufferedReader buf =
      new BufferedReader(
      new InputStreamReader(
      new FileInputStream(
      "/Users/dingzhijie/Desktop/file3.txt"),
      "UTF-8")); String line;
      while ((line = buf.readLine()) != null) {
      line = line.replace("\\s+", "");
      if (line.length()==) {
      continue;
      }
      list.add(line);
      }
      buf.close(); } catch (Exception e) {
      // TODO: handle exception
      throw new RuntimeException(e);
      }
      } public static void launch() {
      try {
      for (String s : list) {
      // 拆分字符串
      String[] a = s.split(";");
      // 获得类名
      Class<?> c = Class.forName(a[]);
      Object obj = c.newInstance(); // 获得方法名
      Method m = c.getMethod(a[]); m.invoke(obj);
      }
      } catch (Exception e) {
      // TODO: handle exception
      System.out.println("执行失败");
      e.printStackTrace();
      }
      } public static void main(String[] args) {
      System.out.println("main");
      for (String string : list) {
      System.out.println(string);
      } System.out.println("--------------");
      Runner.launch();
      }
      }
  • 反射是框架的底层实现原理
    • SSM
  • 注解
    • 为其他开发工具,或其他 Java 程序,提供额外的信息
    • @Override
    • public String toString(){  }
      • @Override 由编译器处理,编译器识别改注解,来对方法重新进行语法检查
  • 自定义注解
    • 要自己编写处理代码
    • package day1902_注解;
      
      import java.lang.annotation.ElementType;
      import java.lang.annotation.Retention;
      import java.lang.annotation.RetentionPolicy;
      import java.lang.annotation.Target; @Target(ElementType.METHOD) // 单个
      //@Target({ElementType.METHOD,ElementType.FIELD}) // 多个 @Retention(RetentionPolicy.RUNTIME) /*
      * 元注解
      *
      * @Target
      * 设置注解目标: 类, 方法,成员变量, 参数...
      *
      * @Retention
      * 保留范围:
      * 源码文件 - 编译时注解信息被丢弃 - 编译器处理
      * 字节码 - 类被加载到内存是丢弃 - 类加载器处理
      * 运行期内存 - 在内存中存在,不会被丢弃 - 自定义注解使用
      *
      */ //定义注解 @interface
      public @interface Test { // 注解的属性
      // 如果不指定默认值, 使用时必须赋值 // int id();
      int id() default ; // 特殊的属性名, 有特殊待遇
      // 如果单独赋值, 可以不写属性名
      String value() default ""; }
  • Junit 单元测试框架

    • Junit 第三方开源工具
    • Junit 是 Java 单元测试的事实标准
    • eclipse 集成了Junit, 可以直接在项目中引入 Junit jar 包
    • 还集成了 Junit 的运行器
    • package day1903_Junit;
      
      import org.junit.Test;
      
      /*
      * 引入Junit 开发包
      * 右键点击项目 Build path - library -
      * add Library - Junit - Junit 4
      *
      *
      * 直接运行即可测试
      * 光标定位在测试方法上, 可以只执行单个测试方法
      * 定位在类上是测试单个类的代码
      *
      */
      public class Test1 { @Test
      public void a(){
      System.out.println("测试a");
      } public void b(){
      System.out.println("测试b");
      }
      @Test
      public void c(){
      System.out.println("测试c");
      } @Test
      public void d(){
      System.out.println("测试d");
      }
      }
  • 网络爬虫
    • 抓取网页页面内容
    • 常用的网络爬虫工具
      • HttpClient
      • Jsoup
  • Jsoup
    • 第三方的开源 API
    • 需要到官网下载 Jsoup jar 文件
    • 参考官方的使用文档, 示例代码
    • package day1904_网络爬虫;
      
      import java.io.IOException;
      
      import org.jsoup.Jsoup;
      import org.junit.Test; /*
      * 引入 Jsoup 开发包
      * 右键点击项目 - Build path - add External jar 选中所有文件
      */
      public class Test1 {
      @Test
      public void test1() throws Exception {
      String s = Jsoup.connect("http://www.baidu.com")
      .execute()
      .body(); System.out.println(s); } @Test
      public void test2() throws Exception {
      String s = Jsoup.connect("http://www.jd.com/")
      .execute()
      .body(); System.out.println(s);
      }
      }

java - day019 - 反射的更多相关文章

  1. JAVA的反射理解

    1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...

  2. java的反射

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

  3. iOS运行时编程(Runtime Programming)和Java的反射机制对比

    运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下:   1.相同点   都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...

  4. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  5. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  6. Java:反射

    初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在 ...

  7. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  8. java笔记--反射进阶之总结与详解

    一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是 ...

  9. java笔记--反射机制之基础总结与详解

    一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...

随机推荐

  1. Spring AOP无法拦截Controller

    参考@参考文章中的评论 首先,应该打开aop代理 <aop:aspectj-autoproxy proxy-target-class="true"/> 其次,应该讲ao ...

  2. How to Plan and Configure YARN and MapReduce 2 in HDP 2.0

    As part of HDP 2.0 Beta, YARN takes the resource management capabilities that were in MapReduce and ...

  3. Swift4.0复习扩展

    1.扩展计算式属性: 2.对方法进行扩展: /// 定义枚举类型Light, /// 它指定了基本类型String enum Light: String { case red = "red& ...

  4. iOS电商类App研发学习总结

    一.涵盖知识点: 1.电商类App架构: https://www.cnblogs.com/loying/p/4801194.html 2.快速搭建电商平台: https://www.jianshu.c ...

  5. 【Leetcode_easy】867. Transpose Matrix

    problem 867. Transpose Matrix solution: class Solution { public: vector<vector<int>> tra ...

  6. 页面进行ajax时 显示一个中间浮动loading

    先发效果图,加载东西的时候如果没有设计或者其它提示会降低用户体验,所以写了个简单的loading弹层. 适用于触屏和pc页面. /* 页面进行ajax时 显示一个中间浮动loading @auther ...

  7. anywhere随启随用的静态文件服务器

    手机移动端调试,也可以使用anywhere anywhere -p 8080  指定端口 anywhere -s 保持浏览器关闭 anywhere -h localhost -p 8080 通过主机名 ...

  8. CountDownLatch和CyclicBarrier使用上的区别

    一.CountDownLatchDemo package com.duchong.concurrent; import java.util.Map; import java.util.concurre ...

  9. php cli传递参数的方法

    php cli传递参数的方法 <pre>$options = "f:g:"; $opts = getopt( $options ); print_r($opts); & ...

  10. Git操作入门

    生成ssh key: ​ ssh-keygen -t rsa -C "lkt@temp.com" ​ 按三次回车,最后在.ssh文件夹下得到id_rsa和id_rsa.pub两个文 ...