Java 学习(2022-07-13)

160 阅读4分钟

Java 学习(2022-07-13)

1. 网络编程

1.1 InetAddress 类

1.1.1 相关方法

  • getLocalHost() 获取本机 InetAddress 对象
  • getByName() 根据指定主机名/域名获取Ip地址对象
  • getHostName() 获取 InetAddress 对象的主机名
  • getHostAddress() 获取 InetAddress 对象的地址
// 1. 获取本机的 InetAddress 对象
InetAddress inetAddress = InetAddress.getLocalHost();
System.out.println(inetAddress); // DESKTOP-U4AL11J/10.67.181.22

// 2. 根据指定主机名,获取 InetAddress 对象
InetAddress host1 = InetAddress.getByName("DESKTOP-U4AL11J");
System.out.println(host1); // DESKTOP-U4AL11J/10.67.181.22

// 3. 根据域名返回 InetAddress 对象,比如 www.baidu.com
InetAddress host2 = InetAddress.getByName("www.baidu.com");
System.out.println(host2); // www.baidu.com/183.232.231.172

// 4. 通过 InetAddress 对象,反向获取对应地址
String hostAddress = host2.getHostAddress();
System.out.println(hostAddress); // 183.232.231.172

// 5. 通过 InetAddress 对象,反向获取对应主机名
String hostName = host2.getHostName();
System.out.println(hostName); // www.baidu.com
  • Socket 后期学

2. 反射

2.1 反射机制

2.1.1 反射介绍

  • 反射机制允许程序在执行期间借助Reflection API取得任何类的内部信息,并能操作对象的属性及方法。反射在设计模式和底层框架都会用到
  • 加载完类之后,在堆中就产生了一个Class类型的对象,这个对象包括了类的完整结构信息,通过该对象得到类的结构。这个对象就像镜子,透过镜子看到类的结构。所以称为反射

2.1.2 反射可以做的事

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造一个类的对象
  • 在运行时得到任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的成员变量和方法
  • 生成动态代理

2.1.3 反射相关类

  • java.lang.Class:代表一个类
  • java.lang.reflect:代表类的方法
  • java.lang.reflect.Field:代表类的成员变量
  • java.lang.reflect.Constructor:代表类的构造方法
// 1. 使用 properties 读取配置文件
Properties properties = new Properties();
properties.load(new FileInputStream("src\re.properties"));

String classfullpath = properties.getProperty("classfullpath");
String method = properties.getProperty("method");

// 2. 传统方法行不通  -》反射机制
// new classfullpath();

// 3. 反射机制解决问题
// 加载类,返回 Class 类型的对象 aClass
Class aClass = Class.forName(classfullpath);
// 通过 aClass 得到加载的类
Object o = aClass.getDeclaredConstructor().newInstance();
// 4. 通过 aClass 得到你加载的类 com.reflect_.Cat 的 method
//    在反射中,可以把方法皆对象(万物皆对象)
Method method1 = aClass.getMethod(method);
method1.invoke(o); // 传统方法 对象方法() , 反射机制 方法.invoke(对象)

// java.lang.reflect.Field : 代表类的成员变量
// getFile 不能得到私有变量
Field ageField = aClass.getField("age");
System.out.println(ageField.get(o));  // 传统写法: 对象.成员变量   反射   成员变量对象.get(对象)

// java.lang.reflect.Constructor 代表类的构造方法
Constructor constructor = aClass.getConstructor(); // 无参构造器
System.out.println(constructor);
Constructor constructor1 = aClass.getConstructor(String.class);// 这传入的 String.class 就是 String 类的 class 对象
System.out.println(constructor1); // 有参构造器

2.1.4 反射优点和缺点

  • 优点:可以动态的创建和使用对象,使用灵活,没有反射机制,框架技术就失去底层支撑
  • 使用反射基本是解释执行,对执行速度有影响

2.1.5 反射调用优化

  • Method和Field、Constructor对象都有setAccessible()方法
  • setAccessible作用是启动和禁用访问安全检查的开关
  • 参数值为true表示反射的对象在使用时取消访问检查,提高反射的效率。参数值 为false则表示反射的对象执行访问检查

2.2 Class 类

2.2.1 Class 介绍

  • Class也是类,因此也继承Object类
  • Class类对象不是new出来的,而是系统创建的
  • 对于某个类的Class类对象,在内存中只有一份,因为类只加载一次
  • 每个类的实例都会记得自己是由哪个- Class实例所生成
  • 通过Class可以完整地得到一个类的完整结构,通过一系列API
  • Class对象是存放在堆的
  • 类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括方法代码,变量名,方法名,访问权限等等)www.zhihu.com/question/38… image.png

2.2.2 Class 常见方法

String classAllpath = "com.reflect_.Car";
// 1. 获取到 Car 类
// <?> 表示 不确定的 Java 类型
Class<?> cls = Class.forName(classAllpath);
// 2. 输出 cls
System.out.println(cls); // 显示 cls 对象  : class com.reflect_.Car
System.out.println(cls.getClass()); // 输出运行类型 class java.lang.Class
// 3. 得到包名
System.out.println(cls.getPackage().getName()); // com.reflect_
Car car = (Car)cls.getConstructor().newInstance();
// 4. 得到全类名
System.out.println(cls.getName()); // com.reflect_.Car
// 5. 通过反射获取属性 brand
Field brand = cls.getField("brand");
System.out.println(brand.get(car));
// 6. 通过反射给属性赋值
brand.set(car, "奔驰"); 

2.2.3 获取 Class 类对象

  1. Class.forName(用于读取配置文件)
  2. 类名.class(多用于参数传递)
  3. 对象.getClass (有对象实例)
  4. 通过类加载器获取到类的 Class 对象
    • 先得到类加载器 car
    • 通过类加载器得到 Class 对象
  5. 基本数据,按照如下方式得到 Class 类对象
Class<Integer> integerClass = int.class;
Class<Character> characterclass = char.class;
Class<Boolean> booleanClass = boolean.class;
system.out.println(integerClass);l/int
  1. 基本数据类型对应的包装类,可以通过 .Type

2.3 类加载

2.3.1 静态加载

编译时加载相关的类,如果没有则报错,依赖性太强

2.3.2 动态加载

运行时加载需要的类,如果运行时不用该类,则不报错,降低依赖性