Java-day17(反射)

news2024/11/19 10:28:27

Reflection(反射)

动态语言的关键

  • 允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法
  • 提供的功能:
    在运行时判断任意一个对象所属类
    在运行时构造任意一个类的对象
    在运行时判断任意一个类所具有的成员变量和方法
    在运行时调用任意一个对象的成员变量和方法
    生成动态代理
    在这里插入图片描述


Person类

@MyAnnotation(value = "atguigu")
public class Person extends Creature<String> implements Comparable,MyInsterface{   
	public String name;
	private int age;
	//创建类时,尽量保留一个空参的构造器
	public Person() {
		super();
		System.out.print("空参");
	}
	public Person(String name) {
		super();
		this.name = name;
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	
	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;
	}
	@MyAnnotation(value = "boos")
	public void show() {
		System.out.println("I am Person");
	}
	public void display(String nation)throws Exception {
		System.out.println("我的国籍是= " + nation);
	}
	private Integer displays(String nation,Integer i)throws Exception {
		System.out.println("我的国籍是= " + nation);
		return i;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	@Override
	public int compareTo(Object arg0) {
		// TODO Auto-generated method stub
		return 0;
	}
	public static void info() {
		System.out.println("Chianese");
	}
	class A {
		
	}
}

在这里插入图片描述

  • 没有反射之前,创建对象,调用方法,属性
@Test
public void test1() throws Exception {
	Person p = new Person();
	p.setName("HaoJie");
	p.setAge(22);
	System.out.println(p);                             
	p.show();
	p.display("中国");
}
  • 有反射之后,创建对象,调用方法,属性
@Test
public void test2() throws Exception{
	Class c = Person.class;//c直接指向Person实体(反射的源头java.lang.Class类)
	//1.创建c对应的运行时类Person类的对象
	Person p = (Person)c.newInstance();
	//2-1.通过反射获取实体的公有属性
	Field f1 = c.getField("name");
	f1.set(p,"LiYunHai");
	System.out.println(p);       
	//2-2.通过反射获取实体的私有属性
	Field f2 = c.getDeclaredField("age");
	f2.setAccessible(true);
	f2.set(p,26);
	System.out.println(p);  
	
	//通过反射调用运行时实体(类)的指定的方法
	Method m1 = c.getMethod("show");
	m1.invoke(p);
	
	Method m2 = c.getMethod("display",String.class);
	m2.invoke(p,"China");		
}

1.理解Class类并实例化Class类对象

在这里插入图片描述

  • 类的具体实现:
    在这里插入图片描述

    创建类,通过编译(javac.exe),生产字节码文件,之后通过java.exe加载(JVM的类加载器完成的)字节码文件,字节码文件加载到内存中,就是一个运行时类,存在缓冲区中。这个运行时类本身就是一个Class的实例
    在这里插入图片描述

  • 每一个运行时类只加载一次

  • 有Class的实例,就可以进行如下操作:

     //*创建对应的运行时类的对象
     //获取对应的运行时类的完整结构(属性,方法,构造器,内部类。。。)
     //*调用对应运行时类的指定的结构(属性,方法,构造器)
     //反射的应用:动态代理
    

获取Class的实例(掌握3种)

@Test
public void test4() throws ClassNotFoundException {
	//1.调用运行时类本身的.class属性
	Class clazz = Person.class;
	System.out.println(clazz.getName());                
	
	Class clazz1 = String.class;
	System.out.println(clazz1.getName());
	System.out.println();
	
	//2.通过运行时类的对象获取
	Person p = new Person();
	Class clazz2  = p.getClass();
	System.out.println(clazz2.getName());
	
	//3.通过Class的静态方法获取
	String classname = "java.lang.String";
	Class clazz3 = Class.forName(classname);
	System.out.println(clazz3.getName());
	
	//4.(了解)通过类的加载器
	ClassLoader classLoader = this.getClass().getClassLoader();
	Class clazz4 = classLoader.loadClass(classname);
	System.out.println(clazz4.getName());
	
	System.out.println(clazz1 == clazz3);//true
	System.out.println(clazz1 == clazz2);//false
	System.out.println(clazz1 == clazz4);//true
}

在这里插入图片描述
例:

@Test	
	public void test5() throws IOException {
		ClassLoader loader1 = ClassLoader.getSystemClassLoader();          
		System.out.println(loader1);//获取ClassLoader类的加载类AppClassLoader
		
		ClassLoader loader2 = loader1.getParent();
		System.out.println(loader2);//ExtClassLoader
		
		ClassLoader loader3 = loader2.getParent();
		System.out.println(loader3);//null(核心类库及引导类无法获取)
		
		
		Class clazz1 = Person.class;
		ClassLoader loader4 = clazz1.getClassLoader();
		System.out.println(loader4);//AppClassLoader
	}

	//掌握如下:查找包下的文件中的部分内容
		ClassLoader loader5 = this.getClass().getClassLoader();                  
		InputStream is = loader5.getResourceAsStream("hello.txt");
		//查找工程下的文件中的部分内容
	//FileInputStream is = new FileInputStream(new File("hello.txt"));
		Properties txt = new Properties();
		txt.load(is);
		String name = txt.getProperty("user");
		System.out.println(name);
		String password = txt.getProperty("password");
		System.out.println(password);

2.在运行时创建类对象并获取类的完整结构

在这里插入图片描述
例:

@Test
	public void test1() throws Exception {
		String className = "Person";                       
		Class clazz = Class.forName(className);  
		//创建对应的运行类的对象
		//要求:1.对应的运行时类要有空参的构造器;2.构造器的权限应在缺省(及以上)
		Object obj = clazz.newInstance();
		Person p = (Person)obj;
		System.out.print(p);  
	}
	
	@Test
	//构造器
	public void test2() throws ClassNotFoundException {
		String className = "Person";  
		Class clazz = Class.forName(className);  
		//getDeclaredConstructors():获取本身类所有的构造器
		Constructor[] cons = clazz.getDeclaredConstructors();
		for(Constructor c : cons) {  
			System.out.println(c);  
	}
		}
	
获取运行时类的方法
@Test
	public void test1() {
		Class clazz = Person.class;
		//1.getMethods():获取运行时类及其父类中所有声明为public的方法
		Method[] m1 = clazz.getMethods();
		for(Method m : m1) {       
			System.out.println(m);
		}
		System.out.println();
		
		//2.获取运行时类本身声明的所有方法
		Method[] m2 = clazz.getDeclaredMethods();
		for(Method m : m2) {
			System.out.println(m);
		}
		System.out.println();
		System.out.println();
	}
获取对应的运行时类的属性
@Test
	public void test1() {
		Class clazz = Person.class;
		//getFields():只能获取运行时类及其父类中声明为public的属性
		Field[] fields = clazz.getFields();
		for(int i = 0;i < fields.length;i++) {
			System.out.println(fields[i]);        
		}
		System.out.println();
		
		//2.getDeclaredFields():获取运行时类本身声明的所有属性
		Field[] fields1 = clazz.getDeclaredFields();
		for(Field f : fields1) {
			System.out.println(f.getName());
		}
	}
获取属性各个部分的内容(权限修饰符 变量类型 变量名)
@Test
    public void test2() {
		Class clazz = Person.class;
		Field[] fields = clazz.getDeclaredFields();
		for(Field f : fields) {
			//1.获取属性的权限修饰符
			int i = f.getModifiers();
			String str = Modifier.toString(i);
			System.out.print(str + " ");      
			//2.获取属性的类型
			Class type = f.getType();
			System.out.print(type.getName() + " ");
			//3.获取属性名
			System.out.print(f.getName());
			System.out.println();
		}
	}
注解 权限修饰符 返回值类型 方法名 形参列表 异常
@Test
	public void test2() {
		Class clazz = Person.class;
		
		Method[] m1 = clazz.getDeclaredMethods();
		for(Method m : m1) {   
			//1.注解
			Annotation[] ann = m.getAnnotations();
			for(Annotation an : ann) {
				System.out.println(an);
			}
			//2.权限修饰符
			String str = Modifier.toString(m.getModifiers());
			System.out.print(str + " ");
			
			//3.返回值类型
			Class returnType = m.getReturnType();
			System.out.print(returnType.getName() + " ");
			
			//4.方法名
			System.out.print(m.getName());
			
			//5.形参列表
			System.out.print("(");
			Class[] params = m.getParameterTypes();
			for(int i = 0;i < params.length;i++) {
				System.out.print(params[i].getName() + " args-" + i + " ");
			}
			System.out.print(")");
			
			//6.异常类型
			Class[] exps = m.getExceptionTypes();
			
			if(exps.length != 0) {
				System.out.print("throws ");
			}
			for(int i = 0;i < exps.length;i++) {
				System.out.print(exps[i].getName());
			}			
			System.out.println();
		}
	}

在这里插入图片描述

import java.lang.annotation.Retention;         
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
@Target({TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
	String value();
}

带泛型的类

public class Creature<T> {
	public double weight; 
	public void breath() {
		System.out.println("呼吸");
	}
}

接口

import java.io.Serializable;

public interface MyInsterface extends Serializable{
	
}

继承,实现接口等

@MyAnnotation(value = "atguigu")
public class Person extends Creature<String> implements Comparable,MyInsterface{  
	public String name;
	private int age;
	//创建类时,尽量保留一个空参的构造器
	public Person() {
		super();
		System.out.print("空参");
	}
	public Person(String name) {
		super();
		this.name = name;
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	
	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;
	}
	@MyAnnotation(value = "boos")
	public void show() {
		System.out.println("I am Person");
	}
	public void display(String nation)throws Exception {
		System.out.println("我的国籍是= " + nation);
	}
	private Integer displays(String nation,Integer i)throws Exception {
		System.out.println("我的国籍是= " + nation);
		return i;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	@Override
	public int compareTo(Object arg0) {
		// TODO Auto-generated method stub
		return 0;
	}
	public static void info() {
		System.out.println("Chianese");
	}
	class A {
		
	}
}

测试

import java.lang.annotation.Annotation;             
import java.lang.reflect.ParameterizedType; 
import java.lang.reflect.Type; 

import org.junit.Test;

public class TestOther {
	
	@Test
	//1.获取运行时类的父类
	public void test1() {
		Class clazz = Person.class;
		Class superClass = clazz.getSuperclass();
		System.out.println(superClass);//class Creature 
	}
	
	@Test
	//2.获取带泛型的父类
	public void test2() {
		Class clazz = Person.class;
		Type type = clazz.getGenericSuperclass();
		System.out.println(type);//Creature<java.lang.String> 
	}
	
	@Test
	//3.获取父类的泛型
	public void test3() {
	Class clazz = Person.class;
	Type type = clazz.getGenericSuperclass();
	
	ParameterizedType param = (ParameterizedType)type; 
	Type[] ars = param.getActualTypeArguments(); 
	
	System.out.println(((Class)ars[0]).getName()); 
	
	}
	
	@Test
	//获取实现的接口
	public void test4() {
		Class clazz = Person.class;
		Class[] interfaces = clazz.getInterfaces(); 
		for(Class i : interfaces) { 
			System.out.println(i); 
		}
		
	}
	@Test
	//获取所在的包
	public void test5() {
		Class clazz = Person.class;
		Package pack = clazz.getPackage();
		System.out.println(pack); 
	}
	
	@Test
	//获取注解
	public void test6() {
		Class clazz = Person.class;
		Annotation[] anns = clazz.getAnnotations();
		for(Annotation a : anns) {
			System.out.println(a); 
		}
	}
}

3.通过反射调用类的指定方法,指定属性

调用指定构造器,创建对象
@Test
	//
	public void test3() throws Exception {
		String className = "Person";    
		Class clazz = Class.forName(className);
		
		Constructor cons = clazz.getDeclaredConstructor(String.class,int.class);
		cons.setAccessible(true);
		Person p = (Person)cons.newInstance("李福根",56);
		System.out.println(p);
	}
调用运行时类中指定的属性
@Test
	public void test3() throws Exception {
		Class clazz = Person.class;
		//1.获取指定的属性
		//getField(String fielName):获取运行时类中声明为public类型的指定属性名为fielName的属性
		Field name = clazz.getField("name");
		//2.创建运行时类的对象
		Person p = (Person)clazz.newInstance();
		System.out.println(p);        
		//3.将运行时指定的属性赋值
		name.set(p, "Jame");
		System.out.println(p);
		
		System.out.println();
		//getDeclaredField(String fielName):获取运行时类中指定属性名为fielName的属性
		Field age = clazz.getDeclaredField("age");//私有属性不能直接用getField来调
		//由于权限修饰符的限制,为保证可以给属性赋值,需要在操作前使此属性可被操作(缺省状态下,可不用)
		age.setAccessible(true);
		age.set(p, 25);
		System.out.println(p);
	}
调用运行时类的指定方法
@Test
	public void test3() throws Exception {
		Class clazz = Person.class;
		//getMethod(String methodName,Class .. params):获取运行时类中声明为public的指定方法
		Method m1 = clazz.getMethod("show");
		Person p = (Person)clazz.newInstance();
		//调用指定的方法:Object invoke(Object obj,Object ... obj)            
		Object returnVal = m1.invoke(p);//方法本身无返回值,就显示为null
		System.out.println(returnVal);
		
		Method m2 = clazz.getMethod("toString");
		Object returnVal1 = m2.invoke(p);
		System.out.println(returnVal1);//方法本身有返回值,就显示为方法的返回值
		
		//调用静态的方法
		Method m3 = clazz.getMethod("info");
		m3.invoke(Person.class);//不需要对象
		
		
		//getDeclaredMethod(String methodName,Class .. params):获取运行时类中声明的指定方法
		Method m4 = clazz.getDeclaredMethod("displays",String.class,Integer.class);
		m4.setAccessible(true);
		Object returnVal2 = m4.invoke(p,"CNN",10);//调用方法
		System.out.println(returnVal2);//返回值
		
	}

4.动态代理与AOP

静态代理

package Proxy;     
//接口
interface ClothFactory{
	void productCloth();
}
//被代理类
class NikeClothFactory implements ClothFactory{

	@Override
	public void productCloth() {
		System.out.println("Nike工厂开工了!");	
	}
}

//代理类
class ProxyFactory implements ClothFactory{
	ClothFactory cf;
	//创建代理类的对象时,实际传入一个被代理类的对象
	public ProxyFactory(ClothFactory cf) {
		this.cf = cf;
	}

	@Override
	public void productCloth() {
		System.out.println("代理开始,收专利费了!");
		cf.productCloth();
	}
	
}
public class TestCiothProduct {
	public static void main(String[] args) {	
	NikeClothFactory nike = new NikeClothFactory();//被代理类
	ProxyFactory proxy = new ProxyFactory(nike);//代理类
	proxy.productCloth();
}
}
动态代理

在这里插入图片描述
在这里插入图片描述

package Proxy;  

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//动态代理
interface Subject{
	void action();
}
//被代理类
class ReaSubject implements Subject{
	public void action() {
		System.out.println("我是被代理类,好囧ing");
	}
}

class MyInvocationHandler implements InvocationHandler{
	Object obj;//实现接口的被代理类对象的声明
	
	//给被代理的对象实例化;返回一个代理类的对象声明
	public Object blind(Object obj) {
		this.obj = obj;
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
	}
	@Override
	//当通过代理类的对象发起被重写的方法的调用时,都会转换为对如下invoke方法的调用
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//method方法的返回值是returnVal
		System.out.println("代理------");
		Object returnVal = method.invoke(obj, args);
		return returnVal;
	}
}
public class dongProxy {
	public static void main(String[] args) {
		//1.被代理类的对象
		ReaSubject real = new ReaSubject();
		//2.创建实现InvocationHandler接口的类对象
		MyInvocationHandler handler = new MyInvocationHandler();
		//3.调用blind()方法,动态的返回一个同样实现了real所在类实现的接口Subject的代理类的对象
		Object obj = handler.blind(real);
		Subject sub = (Subject)obj;//此时的sub就是代理类的对象
		
		sub.action();//跳转到InvocationHandler接口的实现类的invoke()方法的调用
		
		//例
		NikeClothFactory nike = new NikeClothFactory();//被代理类
		ClothFactory proxyCloth = (ClothFactory)handler.blind(nike);//proxyCloth即为代理类的对象
		proxyCloth.productCloth();
	}
}
动态代理与AOP

在这里插入图片描述
在这里插入图片描述
例:

package com.al.java;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface Human{
	void info();
	void fly();   
}
//被代理类
class SuperMan implements Human{
	public void info() {
		System.out.println("我是超人");
	}
	public void fly() {
		System.out.println("I believe I can fly!");
	}
}
class HumanUtil{
	public void method1() {
		System.out.println("========方法一======");
	}
	public void method2() {
		System.out.println("========方法二======");
	}
}

class MyInvocationHandler implements InvocationHandler{
	Object obj;
	public void setObject(Object obj) {
		this.obj = obj;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		HumanUtil h = new HumanUtil();
		h.method1();
		Object returnval = method.invoke(obj, args);
		h.method2();
		return returnval;
	}
	
	
}

class MyProxy{
	//动态的创建一个代理类对象
	public static Object getProxyInstance(Object obj) {
		MyInvocationHandler handler = new MyInvocationHandler();
		handler.setObject(obj);
		
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler);
	}
}

public class TestAOP {
	public static void main(String[] args) {	
	SuperMan man = new SuperMan();//创建被代理类对象
	Object obj = MyProxy.getProxyInstance(man);//返回代理类对象
	Human hu = (Human)obj;
	hu.info();//通过代理类的对象调用重写的抽象方法
	System.out.println();
	hu.fly();
	}
}

运行示例
请添加图片描述
感谢大家的支持,关注,评论,点赞!
参考资料:
尚硅谷宋红康20天搞定Java基础下部

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1040425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3 动态组件 component:is= 失效

错误代码 用Vue3&#xff0c;组件无需注册&#xff0c;所以就会提示“注册了不不使用”的报错&#xff0c; 于是用了异步注册&#xff0c;甚至直接为了不报错就在下面使用3个组件&#xff0c;有异步加载&#xff0c;但还是实现不了预期效果 <script setup> import { re…

#define定义标识符详解

0.预定义符号 在讲解#define之前先给大家介绍几个预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI C&#xff08;标准C&#xff09;&#xff…

服务器感染了Locked勒索病毒后的正确处理步骤,勒索病毒解密

在服务器中感染了Locked勒索病毒后&#xff0c;应该采取以下一系列步骤来应对和清除病毒&#xff1a; 立即断开网络连接&#xff1a;防止病毒进一步传播感染。备份重要数据&#xff1a;在执行任何操作之前&#xff0c;一定要先备份服务器上的重要数据。这样可以防止在处理病毒过…

经典网络解析(四) ResNet | 残差模块,网络结构代码实现全解析

文章目录 1 设计初衷2.网络结构2.1 残差块2.2 中间的卷积网络特征提取块1 两层33卷积层2 先11卷积层&#xff0c;再33卷积层&#xff0c;再33卷积层 2.3 结构总览表格 3 为什么残差模块有效&#xff1f;3.1 前向传播3.2 反向传播3.3 恒等映射3.4 集成模型 4.代码实现 1 设计初衷…

如何学习嵌入式Linux?

今日话题&#xff0c;如何学习嵌入式Linux&#xff1f;嵌入式底层开发是一种重要的技术&#xff0c;它被广泛应用于各种嵌入式系统中。随着科技的不断发展&#xff0c;嵌入式系统已经成为了我们日常生活中不可或缺的一部分。这就使得嵌入式开发的重要性也凸显出来。刚好我这有一…

opencv for unity package在unity中打开相机不需要dll

下载OpenCV for Unity 导入后&#xff0c;里面有很多案例 直接打开就可以运行 打开相机

Linux: errno: EADDRNOTAVAIL; ipv6-bind;Cannot assign requested address

文章目录 解释一种情况tentative 的解释 解释一种情况 #define EADDRNOTAVAIL 99 /* Cannot assign requested address */ 有一种情况是&#xff1a;当IP6的地址处于tentative的时候&#xff0c;就会返回这个错误。下面的是bind的调用的时候会check地址的flag。如果是tentati…

Java学习星球,十月集训,五大赛道(文末送书)

目录 什么是知识星球&#xff1f;我的知识星球能为你提供什么&#xff1f;专属专栏《Java基础教程系列》内容概览&#xff1a;《Java高并发编程实战》、《MySQL 基础教程系列》内容概览&#xff1a;《微服务》、《Redis中间件》、《Dubbo高手之路》、《华为OD机试》内容概览&am…

一款Python认证和授权的利器

迷途小书童 读完需要 7分钟 速读仅需 3 分钟 1 简介 authlib 是一个开源的 Python 库&#xff0c;旨在提供简单而强大的认证和授权解决方案。它支持多种认证和授权协议&#xff0c;如 OAuth、OpenID Connect 和 JWT。authlib 具有灵活的架构和丰富的功能&#xff0c;使开发人员…

lS1028 + 六网口TSN 硬交换+QNX/Linux实时系统解决方案在轨道交通系统的应用

lS1028 六网口TSN 硬交换QNX/Linux实时系统解决方案在轨道交通系统的应用 以下是在轨道交通应用的实物&#xff1a; CPUNXP LS1028A架构双核Cortex-A72主频1.5GHzRAM2GB DDR4ROM8GB eMMCOSUbuntu20.04供电DC 12V工作温度-40℃~ 80℃ 功能数量参数Display Port≤1路支持DP1.3…

UniAccess Agent卸载

异常场景&#xff1a; UniAccess Agent导致系统中的好多设置打不开 例如:ipv4的协议,注册表,host等等 需要进行删除,亲测有效,及多家答案平凑的 借鉴了这位大神及他里面引用的大神的内容 https://blog.csdn.net/weixin_44476410/article/details/121605455 问题描述 这个进…

Android开发MVP架构记录

Android开发MVP架构记录 安卓的MVP&#xff08;Model-View-Presenter&#xff09;架构是一种常见的软件设计模式&#xff0c;用于帮助开发者组织和分离应用程序的不同组成部分。MVP架构的目标是将应用程序的业务逻辑&#xff08;Presenter&#xff09;、用户界面&#xff08;V…

由于找不到msvcr110.dll的5种解决方法

在使用电脑的过程中&#xff0c;我们可能会遇到一些问题&#xff0c;比如打开软件时提示找不到 msvcr110.dll 文件丢失。这通常意味着该文件已被删除或损坏&#xff0c;导致程序无法正常运行。本文将介绍几种解决方案&#xff0c;帮助您解决这个问题。 首先&#xff0c;我们需…

Linxu下c语言实现socket+openssl数据传输加密

文章目录 1. Socket连接建立流程2、SocketSSL的初始化流程3、初始化SSL环境&#xff0c;证书和密钥4、SocketSSL 的c语言实现4.1 编写SSL连接函数4.2 编写加密服务端server.c4.3 编写加密客户端client.c 5、使用tcpdump检验源码获取 在进行网络编程的时候&#xff0c;我们通常使…

分布式算法相关,使用Redis落地解决1-2亿条数据缓存

面试题&#xff1a;1~2亿数据需要缓存&#xff0c;请问如何设计个存储案例 回答&#xff1a;单机单台100%不可能&#xff0c;肯定是分布式存储&#xff0c;用redis如何落地&#xff1f; 一般业界有三种解决方案&#xff1a; 哈希取余分区 2亿条记录就是2亿个k&#xff0c;v&…

Linux学习-HIS部署(3)

Jenkins插件资源下载 Jenkins部署 Jenkins部署 #Jenkins主机安装OpenJDK环境 [rootJenkins ~]# yum clean all; yum repolist -v ... Total packages: 8,265 [rootJenkins ~]# yum -y install java-11-openjdk-devel.x86_64 #安装OpenJDK11 [rootJenkins ~]# ln -s /usr/l…

Css 美化滚动条

/*设置滚动条宽度为 6px*/ ::-webkit-scrollbar {width: 6px; } /*设置背景颜色&#xff0c;并设置边框倒角&#xff0c;设置滚动动画&#xff0c;0.2 */ ::-webkit-scrollbar-thumb {background-color: #0003;border-radius: 10px;transition: all .2s ease-in-out; } /*设置滚…

探索创意的新辅助,AI与作家的完美合作

在现代社会&#xff0c;文学创作一直是人类精神活动中的重要一环。从古典文学到现代小说&#xff0c;从诗歌到戏剧&#xff0c;作家们以他们的独特视角和文学天赋为我们展示了丰富多彩的人生世界。而近年来&#xff0c;人工智能技术的快速发展已经渗透到各行各业&#xff0c;文…

Leetcode191. 位1的个数

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为汉明重量&#xff09;。 思路&…

人工智能AI 全栈体系(六)

第一章 神经网络是如何实现的 这些年神经网络的发展越来越复杂&#xff0c;应用领域越来越广&#xff0c;性能也越来越好&#xff0c;但是训练方法还是依靠 BP 算法。也有一些对 BP 算法的改进算法&#xff0c;但是大体思路基本是一样的&#xff0c;只是对 BP 算法个别地方的一…