java~反射
反射
使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)
原理图
加载完类后,在堆中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象包含了类的完整结构信息。通过这个对象得到类的结构。这个Class对象就像一面镜子,透过这个镜子看到类的结构,所以,形象的称之为:反射。
使用
配置文件re.properties
classfullpath=com.reflection.Cat
method=hi
package com.reflection;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;public class quection {public static void main(String[] args) {//问题:根据配置文件 re.properties 中的指定信息,创建Cat类 并 调用hi方法;//反射//1. 使用Properties类 获取配置文件中的内容Properties properties = new Properties();properties.load(new FileInputStream("src\\main\\resources\\re.properties"));String classfullpath = properties.getProperty("classfullpath");String methodname = properties.getProperty("method");System.out.println("classfullpath:" + classfullpath);System.out.println("method:" + method);//2. 使用反射机制解决Class aClass = Class.forName(classfullpath); //加载类,返回Class类型的对象aClassObject o = aClass.newInstance(); //通过aClass得到 com.reflection.Cat 类的对象实例System.out.println("o的运行类型:" + o.getClass());//通过 aClass 得到 com.reflection.Cat 类的 methodName为“hi”的方法对象//即:在反射中,可把方法视为对象(万物接对象)Method method1 = aClass.getMethod(methodname);System.out.println("===========================================");//通过 方法对象 来实现 调用方法; 也就是 通过 method1对象 来调用 Cat类中的方法;method1.invoke(o);//传统方法:对象.方法(); 反射:方法.invoke(对象);}
}
Java反射机制可以完成
1、在运行时判断任意一个对象所属的类
2、在运行时构造任意一个类的对象
3、在运行时得到任意一个类所具有的成员变量和方法
4、在运行时调用任意一个对象的成员变量和方法
5、生成动态代理
反射相关的主要类
在java.lang.reflection包中
1、java.lang.Class:代表一个类,Class对象表示某个类加载后在堆中的对象
2、java.lang.reflect.Method:代表类的方法,Method对象表示某个类的方法
3、java.lang.reflect.Field:代表类的成员变量,Field对象表示某个类的成员变量
4、java.lang.reflect.Constructor:代表类的构造方法,Constructor对象表示构造器
//java.lang.reflect.Field:代表类的成员变量,Field对象表示某个类的成员变量//得到name字段;//getField不能得到私有的属性Field name = cls.getField("age");System.out.println(name.get(o));//传统写法:对象.成员变量 反射:成员变量对象.get(对象)
//java.lang.reflect.Constructor:代表类的构造方法,Constructor对象表示构造器Constructor constructor = aClass.getConstructor();//()中可以指定构造器参数类型,返回无参构造器System.out.println(constructor);//Cat()Constructor constructor1 = aClass.getConstructor(String.class);//这里传入的String.class 就是String类的Class对象System.out.println(constructor1);//Cat(String name)
反射的简单优化——关闭访问检查
1、Method 和 Field、Constructor对象都有setAccessible()方法
2、setAccessible作用是启动和禁用访问安全检查的开关
3、参数值为true表示,反射的对象在使用时取消访问检查,提高反射的效率。参数值为false,则表示反射的对象执行访问检查。
Method method1 = aClass.getMethod("hi");//通过 aClass 得到 com.reflection.Cat 类的 methodName为“hi”的方法对象method1.setAccessible(true);
Class类
1、Class也是类,因此也继承Object类
2、Class类对象不是new出来的,而是系统创建的(通过类加载器创建的)
3、对于某一个类的Class类对象,在内存中只有一份,因为类只加载一次!(同一个类的类加载只有一次!)
4、每个类的实例都会记得自己是由哪个Class实例所生成
5、通过Class对象可以完整地得到一个类的完整结构,通过一系列API
6、Class对象是存放在堆的
7、类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括 方法代码,变量名,方法名,访问权限等)
Class<?> aClass = Class.forName("com.reflection.Cat");//对于某一个类的Class类对象,在内存中只有一份,因为类只加载一次!Class<?> bClass = Class.forName("com.reflection.Cat");System.out.println(aClass.hashCode()); //hashCode:356573597System.out.println(bClass.hashCode()); //hashCode:356573597Class<?> cClass = Class.forName("com.reflection.Dog");System.out.println(cClass.hashCode());//hashCode:1735600054
Class类的常用方法

package com.reflection.class_;import com.reflection.Car;import java.lang.reflect.Field;public class Class02 {public static void main(String[] args) throws Exception {String classpath = "com.reflection.Car";//1、返回指定类名 classpath 的 Class 对象//<?> 表示不确定的java类型Class<?> aClass = Class.forName(classpath);System.out.println(aClass);//aClass是哪个类的Class对象:com.reflection.CarSystem.out.println(aClass.getClass());//aClass 的运行类型:java.lang.Class//2、获取包名System.out.println(aClass.getPackage().getName());//3、获取全类名System.out.println(aClass.getName());//4、创建实例对象//newInstance会调用无参构造方法,无参构造方法必须存在Object car = aClass.newInstance();Car car = (Car) aClass.newInstance();System.out.println(car);//5、通过反射获取属性Field brand = aClass.getField("brand");System.out.println(brand.get(car));//6、通过反射给属性赋值brand.set(car,"凯迪拉克");System.out.println(brand.get(car));//7、获取所有的public属性字段Field[] fields = aClass.getFields();for (Field f : fields) {System.out.println(f.getName());//名称}//8、获取所有的属性字段Field[] declaredFields = aClass.getDeclaredFields();for (Field f : declaredFields) {System.out.println(f.getName());//名称}}
}
如果只想让类的静态代码块执行,只需要写Class.forName();
获取Class对象的6种方式
1、Class.forName(“全类名”)
使用前提: 已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException异常
应用场景: 多用于配置文件读取类全路径,加载类;
String classpath = "com.reflection.Car";
//1、返回指定类名 classpath 的 Class 对象
//<?> 表示不确定的java类型
Class<?> aClass = Class.forName(classpath);
2、类名.class
使用前提: 已知具体的类,通过类的class获取,该方式最为安全可靠,程序性能最高
应用场景: 多用于参数传递,比如通过反射得到对应构造器对象
Class cls = Car.class;
3、对象.getClass()
使用前提: 已知某个类的实例,调用该实例的getClass()方法获取Class对象
应用场景: 通过创建好的对象,获取Class对象;
Car car = new Car();
Class cls = car.getClass();//运行类型
4、classLoader对象.loadClass(“类的全类名”);
//(1)先得到类加载器 car
Car car = new Car();
ClassLoader classLoader = car.getClass().getClassLoader();
//(2)通过类加载器得到Class对象
Class cls = classLoader.loadClass("com.reflection.Car");
5、基本数据(int,char,boolean,float,double,byte,long,short)可以直接 基本数据类型.class 得到Class类对象
Class cls = 基本数据类型.class;EX:
Class<Integer> integerClass = int.class;
6、基本数据类型对应的包装类,可以通过.TYPE 得到Class类对象:包装类.TYPE
Class cls = 包装类.TYPEEX:
Class<Character> type = Character.TYPE;
哪些类型有Class对象
1、外部类,成员内部类,静态内部类,局部内部类,匿名内部类
2、interface:接口
3、数组
4、enum:枚举
5、annotation:注解
6、基本数据类型
7、void
Class<String> aClass1 = String.class;//外部类
Class<Serializable> aClass2 = Serializable.class;//接口
Class<Integer[]> aClass3 = Integer[].class;//数组
Class<float[][]> aClass4 = float[][].class;//二维数组
Class<Deprecated> aClass5 = Deprecated.class;//注释
//枚举
Class<Thread.State> aClass6 = Thread.State.class;
//基本数据类型
Class<Long> aClass7 = long.class;
//void数据类型
Class<Void> aClass8 = void.class;
Class<Class> aClass9 = Class.class;//class对象
类加载
反射机制是java实现动态语言的关键,java通过反射实现类动态加载;
1、静态加载:编译时(执行javac命令时)加载相关的类,如果类不存在则报错,依赖性太强
2、动态加载:运行时加载需要的类,如果运行时用不到该类,则不会报错,即使这个类不存在,这样降低了依赖性
//静态加载
Dog dog = new Dog();
//编译时,类不存在则报错,依赖性太强//反射 -> 动态加载
Class cls = Class.forName("Person")
//加载Person类,运行时执行到该段代码时,才会进行加载;用不到该类,不会报错,即使这个类不存在
类加载时机
1、当创建对象时(new)//静态加载
2、当子类被加载时,父类也加载 //静态加载
3、调用类中的静态成员时 //静态加载
4、通过反射 //动态加载
类加载的三个阶段
加载、连接(验证、准备、解析)、初始化
连接阶段-准备
class A{//属性-成员变量-字段 是如何处理的//1、n1 是实例属性,不是静态变量,在准备阶段是不会分配内存的//2、n2 是静态变量,分配内存n2 并弄人初始化值为0,而不是20(20是在初始化阶段进行赋值的)//3、n3 是static final,是常量,和静态变量不一样,一旦赋值就不变 n3 = 30;public int n1 = 10;public static int n2 = 20;public static final int n3 = 30;
}
路径问题
离开IDEA就无效了
src是类的根路径
//Thread.currentThread()是线程方法//getContextClassLoader()是线程对象的方法,可以获取到当前线程的类加载器对象//getResource()是类加载器对象的方法,当前线程的类加载器默认从类的根路径下加载资源,从src的下一级开始写//可以拿到文件的绝对路径String path = Thread.currentThread().getContextClassLoader().getResource("classinfo.properties").getPath();FileReader reader = new FileReader(path);//拿到绝对路径,自己new了一个流new Properties();
直接以流的形式返回
InputStream reader = Thread.currentThread().getContextClassLoader().getResourceAsStream("classinfo.properties");
new Properties();
资源绑定器
java.util包下提供了一个资源绑定器,便于获取属性配置文件中的内容,属性配置文件xx.properties必须放在类路径下,从src的下一级开始,最后不写properties后缀
ResourceBundle bundle = ResourceBundle.getBundle("classinfo");String className = bundle.getString("className");//不需要 new Properties();
通过反射获取类的结构信息
一、java.lang.Class类
1、getName:获取全类名
2、getSimpleName:获取简单类名
3、getFields:获取所有public修饰的属性,包含本类以及父类
4、getDeclaredFields:获取本类中所有属性
5、getMethods:获取所有public修饰的方法,包含本类以及父类的
6、getDeclaredMethods:获取本类中所有方法
7、getConstructors:获取本类所有public修饰的构造器
8、getDeclaredConstructors:获取本类中所有构造器
9、getPackage:以package形式返回包信息
10、getSuperClass:以Class形式返回父类信息
11、getIntergaces:以Class[]形式返回接口信息
12、getAnnotations:以Annotation[]形式返回注解信息
package com.reflection.class_;import org.junit.jupiter.api.Test;import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;public class ReflectionUtils {@Testpublic void api_01() throws Exception {//得到Class对象Class<?> personCls = Class.forName("com.reflection.class_.Person");//1、getName:获取全类名System.out.println(personCls.getName());//com.reflection.class_.Person//2、getSimpleName:获取简单类名System.out.println(personCls.getSimpleName());//Person//3、getFields:获取所有public修饰的属性,包含本类以及父类Field[] fields = personCls.getFields();for (Field field : fields) {System.out.println("本类以及父类的属性:"+field.getName());}//4、getDeclaredFields:获取本类中所有属性Field[] declaredFields = personCls.getDeclaredFields();for (Field declaredField : declaredFields) {System.out.println("本类中所有的属性:"+declaredField.getName());}//5、getMethods:获取所有public修饰的方法,包含本类以及父类的Method[] methods = personCls.getMethods();for (Method method : methods) {System.out.println("本类以及父类中的public方法:"+ method.getName());}//6、getDeclaredMethods:获取本类中所有方法Method[] declaredMethods = personCls.getDeclaredMethods();for (Method declaredMethod : declaredMethods) {System.out.println("本类中所有方法:"+ declaredMethod.getName());}//7、getConstructors:获取本类所有public修饰的构造器Constructor<?>[] constructors = personCls.getConstructors();for (Constructor<?> constructor : constructors) {System.out.println("本类中所有public修饰的构造器:"+constructor.getName());}//8、getDeclaredConstructors:获取本类中所有构造器Constructor<?>[] declaredConstructors = personCls.getDeclaredConstructors();for (Constructor<?> declaredConstructor : declaredConstructors) {System.out.println("本类中所有构造器:"+declaredConstructor.getName());}//9、getPackage:以package形式返回包信息System.out.println(personCls.getPackage());//com.reflection.class_//10、getSuperClass:以Class形式返回父类信息Class<?> superclass = personCls.getSuperclass();System.out.println("父类的Class对象:"+superclass);//com.reflection.class_.A//11、getIntergaces:以Class[]形式返回接口信息Class<?>[] interfaces = personCls.getInterfaces();for (Class<?> anInterface : interfaces) {System.out.println("接口信息:"+anInterface);}//12、getAnnotations:以Annotation[]形式返回注解信息Annotation[] annotations = personCls.getAnnotations();for (Annotation annotation : annotations) {System.out.println("注解信息:"+annotation);}}
}class A {public String hobby;public void hi() {}public A() {}public A(String hobby) {}
}interface IA {}interface IB {}@Deprecated
class Person extends A implements IA, IB {//属性public String name;protected static int age;String job;private double sal;//构造器public Person() {}public Person(String name) {}//私有的private Person(String name, int age) {}//方法public void m1(String name, int age, double sal) {}protected String m2() {return null;}void m3() {}private void m4() {}
}
二、java.lang.reflect.Field类
1、getModifiers:以int形式返回修饰符(默认修饰符为0,public 为 1,private 为2,protected 为 4,static 为 8,final 为 16,public(1) + static(8) = 9)
2、getType:以Class形式返回类型
3、getName:返回属性名
public void api_02() throws Exception {//得到Class对象Class<?> personCls = Class.forName("com.reflection.class_.Person");//getDeclaredFields:获取本类中所有属性Field[] declaredFields = personCls.getDeclaredFields();for (Field declaredField : declaredFields) {//1、getModifiers:以int形式返回修饰符(默认修饰符为0,public 为 1,private 为2,protected 为 4,static 为 8,final 为 16,public(1) + static(8) = 9)//2、getType:以Class形式返回类型//3、getName:返回属性名System.out.println("本类中所有的属性:"+declaredField.getName()+"该属性的修饰符值:"+declaredField.getModifiers()+"该属性的类型:" + declaredField.getType());}
三、java.lang.reflect.Method类
1、getModifiers:以int形式返回修饰符(默认修饰符为0,public 为 1,private 为2,protected 为 4,static 为 8,final 为 16)
2、getReturnType:以Class形式获取,返回类型
3、getName:返回方法名
4、getParamterTypes:以Class[]返回参数类型数组
@Test
public void api_02() throws Exception {//得到Class对象Class<?> personCls = Class.forName("com.reflection.class_.Person");//getDeclaredMethods:获取本类中所有方法Method[] declaredMethods = personCls.getDeclaredMethods();for (Method declaredMethod : declaredMethods) {//1、getModifiers:以int形式返回修饰符(默认修饰符为0,public 为 1,private 为2,protected 为 4,static 为 8,final 为 16)//2、getReturnType:以Class形式获取,返回类型//3、getName:返回方法名System.out.println("本类中所有方法:"+ declaredMethod.getName()+"该方法的访问修饰符值:"+declaredMethod.getModifiers()+"该方法返回类型:" + declaredMethod.getReturnType());//4、getParamterTypes:以Class[]返回参数类型数组,输出当前这个方法的形参数组情况Class<?>[] parameterTypes = declaredMethod.getParameterTypes();for (Class<?> parameterType : parameterTypes) {System.out.println("该方法的形参类型:"+parameterType);}}
}
四、java.lang.reflect.Constructor类
1、getModifiers:以int形式返回修饰符
2、getName:返回构造器名(全类名)
3、getParameterTypes:以Class[]返回参数类型数组
@Test
public void api_02() throws Exception {//得到Class对象Class<?> personCls = Class.forName("com.reflection.class_.Person");//getDeclaredConstructors:获取本类中所有构造器Constructor<?>[] declaredConstructors = personCls.getDeclaredConstructors();for (Constructor<?> declaredConstructor : declaredConstructors) {//1、getModifiers:以int形式返回修饰符//2、getName:返回构造器名(全类名)//3、getParameterTypes:以Class[]返回参数类型数组System.out.println("本类中所有构造器:"+declaredConstructor.getName()+"本类中构造器访问修饰符值:"+declaredConstructor.getModifiers());Class<?>[] parameterTypes = declaredConstructor.getParameterTypes();for (Class<?> parameterType : parameterTypes) {System.out.println("该构造器的形参类型:"+ parameterType);}}
通过反射创建对象
使用到的Class类中的相关方法
newInstance:调用类中的无参构造器,获取对应类的对象
getConstructor(Class…clazz):根据参数列表,获取对应的public构造器对象
getDecalaredConstructor(Class…clazz):根据参数列表,获取对应的构造器对象
Constructor类相关方法
setAccessible:暴破
newInstance(Object…obj):调用构造器
package com.reflection.class_;import java.lang.reflect.Constructor;public class ReflecCreateInstance {public static void main(String[] args) throws Exception {//1、先获取到User类的Class对象Class<?> userClass = Class.forName("com.reflection.class_.User");//2、通过public的无参构造器创建实例Object o = userClass.newInstance();System.out.println(o);//3、通过public的有参构造器创建对象实例/* 此constructor对象就是public User(String name) {//有参public构造器this.name = name;}* *///先得到对应的构造器Constructor<?> constructor = userClass.getConstructor(String.class);//在创建实例,并传入实参Object o1 = constructor.newInstance("猫饭");System.out.println(o1);//4、通过private的有参构造器创建对象实例Constructor<?> constructor1 = userClass.getDeclaredConstructor(int.class, String.class);//暴破,使用反射可以访问private构造器/方法/属性, 反射面前,一切都是纸老虎constructor1.setAccessible(true);Object o2 = constructor1.newInstance(28, "猫饭美少女");System.out.println(o2);}
}class User {private int age = 18;private String name = "小A";public User() { //无参public构造器}public User(String name) {//有参public构造器this.name = name;}public User(int age, String name) {//有参private构造器this.age = age;this.name = name;}@Overridepublic String toString() {return "User{" +"age=" + age +", name='" + name + '\'' +'}';}
}
通过反射访问类中的成员
使用到的方法
1、属性名获取Field对象:Field f = class对象.getDeclaredField(属性名);私有,公有都可以拿到
2、暴破:f.setAccessible(true); //f是Field
3、访问
f.set(o,值);//o表示对象
syso(f.get(o)); //o表示对象
4、注意:如果是静态属性,则set和get中的参数o,可以写成null(因为静态属性是跟类相关绑定的)
package com.reflection.class_;import java.lang.reflect.Field;public class ReflecAccessProperty {public static void main(String[] args) throws Exception {//1、获取Class对象Class<?> studentClass = Class.forName("com.reflection.class_.Student");//2、创建对象Object o = studentClass.newInstance();System.out.println(o.getClass());//获取运行类型//3、使用反射得到age属性对象Field age = studentClass.getField("age");age.set(o,18);//通过反射给属性赋值System.out.println(o);System.out.println(age.get(o));//通过反射获取属性的值//4、通过反射操作 name属性Field name = studentClass.getDeclaredField("name");name.setAccessible(true);
// name.set(o,"猫饭");//通过反射给属性赋值name.set(null,"猫饭");//因为name是static属性,所以o也可以写出nullSystem.out.println(o);System.out.println(name.get(o));//通过反射获取属性的值System.out.println(name.get(null));//获取属性值,因为name是static属性,所以o也可以写出null}
}class Student {public int age;private static String name;public Student() {}@Overridepublic String toString() {return "Student{" +"age=" + age +", name='" + name + '\'' +'}';}
}
通过反射访问类中的方法
使用到的方法
1、根据方法名和参数列表获取Method方法对象:Method m = class对象.getDeclaredMethod(方法名,XX.class);//得到本类中所有的方法
2、获取对象:Objec o = class对象.newInstance();
3、暴破:m.setAccessible(true);
4、访问:Object returnValue = m.invoke(o,实参列表); //o就是对象
5、注意:如果是静态方法,则invoke的参数o,可以写成null!
EX:
package com.reflection.class_;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class ReflecAccessMethod {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {//1、获取Class对象Class<?> aClass = Class.forName("com.reflection.class_.Boss");//2、创建对象Object o = aClass.newInstance();//3、调用public 的 hi方法//Method hi1 = aClass.getMethod("hi", String.class);Method hi = aClass.getDeclaredMethod("hi", String.class);hi.invoke(o,"猫饭!");//4、调用private static 方法Method say = aClass.getDeclaredMethod("say", int.class, String.class, char.class);say.setAccessible(true);System.out.println(say.invoke(o,18,"猫饭",'女'));//5、在反射中,如果方法有返回值,统一返回Object,但是他运行类型和方法定义的返回类型一致Object o1 = say.invoke(null,28, "美少女", '女');System.out.println("o1的运行类型="+o1.getClass());//String}
}class Boss{public int age;private static String name;public Boss(){ //构造器}private static String say(int n, String s, char c) { //静态方法return n + "" + s + "" +c;}public void hi(String s){//普通public方法System.out.println("hi!"+ s);}
}
相关文章:

java~反射
反射 使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码) 原理图 加载完类后,在堆中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对…...

【Linux】(26) 详解磁盘与文件系统:从物理结构到inode机制
目录 1.认识磁盘、 1.1 理论 1.2 磁盘的物理结构 CHS 寻址 1.3 磁盘的逻辑抽象结构 2. inode 结构 1.Boot Block 启动块 2.Super Block(超级块) 3.Group Descriptor Block(块组描述符) 4.Data Blocks (数据块) 5.Inode…...

8.1 字符串中等 43 Multiply Strings 38 Count and Say
43 Multiply Strings【默写】 那个难点我就没想先解决,原本想法是先想其他思路,但也没想出。本来只想chat一下使用longlong数据类型直接stoi()得不得行,然后就看到了答案,直接一个默写的大动作。但这道题确实考察的是还原乘法&…...

upload-labs靶场:1—10通关教程
目录 Pass-01(JS 验证) Pass-02(MIME) Pass-03(黑名单绕过) Pass-04(.htaccess 绕过) Pass-05(大小写绕过) Pass-06(空格绕过) …...
Hive3:一键启动、停止、查看Hive的metastore和hiveserver2两个服务的脚本(好用)
脚本内容 #!/bin/bash # 一键启动、停止、查看Hive的metastore和hiveserver2两个服务的脚本 function start_metastore {# 启动Hive metastore服务hive --service metastore >/dev/null 2>&1 &for i in {1..30}; doif is_metastore_running; thenecho "Hiv…...

遗传算法与深度学习实战——生命模拟及其应用
遗传算法与深度学习实战——生命模拟及其应用 0. 前言1. 康威生命游戏1.1 康威生命游戏的规则1.2 实现康威生命游戏1.3 空间生命和智能体模拟 2. 实现生命模拟3. 生命模拟应用小结系列链接 0. 前言 生命模拟是进化计算的一个特定子集,模拟了自然界中所观察到的自然…...
大数据|使用Apache Spark 删除指定表中的指定分区数据
文章目录 概述方法 1: 使用 Spark SQL 语句方法 2: 使用 DataFrame API方法 3: 使用 Hadoop 文件系统 API方法 4: 使用 Delta Lake使用注意事项常见相关问题及处理结论 概述 Apache Spark 是一个强大的分布式数据处理引擎,支持多种数据处理模式。在处理大型数据集时…...

OSPF动态路由协议实验
首先地址划分 一个骨干网段分成三个,r1,r2,r5三个环回网段 ,总共要四个网段 192.168.1.0/24 192.168.1.0/26---骨干网段 192.168.1.0/28 192.168.1.16/28 192.168.1.32/28 备用 192.168.1.64/28 192.168.1.64/26---r1环回 192.1…...
tcp中accept()的理解
源码 参数理解 NAMEaccept, accept4 - accept a connection on a socketSYNOPSIS#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);#define _GNU_SOURCE …...

让我们逐行重现 GPT-2:第 1 部分
欢迎来到雲闪世界。Andrej Karpathy 是人工智能 (AI) 领域的顶尖研究人员之一。他是 OpenAI 的创始成员之一,曾领导特斯拉的 AI 部门,目前仍处于 AI 社区的前沿。 在第一部分中,我们重点介绍如何实现 GPT-2 的架构。虽然 GPT-2 于 2018 年由 …...

第十九天内容
上午 1、构建vue发行版本 2、java环境配置 jdk软件包路径: https://download.oracle.com/java/22/latest/jdk-22_linux-x64_bin.tar.gz 下午 1、安装tomcat软件 tomcat软件包路径: https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.26/bin/apache-to…...

Hive之扩展函数(UDF)
Hive之扩展函数(UDF) 1、概念讲解 当所提供的函数无法解决遇到的问题时,我们通常会进行自定义函数,即:扩展函数。Hive的扩展函数可分为三种:UDF,UDTF,UDAF。 UDF:一进一出 UDTF:一进多出 UDAF:…...
jdk1.8中HashMap为什么不直接用红黑树
最开始使用链表的时候,空间占用比较少,而且由于链表短,所以查询时间也没有太大的问题。可是当链表越来越长,需要用红黑树的形式来保证查询的效率。 参考资料: https://blog.51cto.com/u_13294304/3075723...
消息推送只会用websocket、轮询?试试SSE,轻松高效。
SSE介绍 HTTP Server-Sent Events (SSE) 是一种基于 HTTP 的服务器推送技术,它允许服务器向客户端推送数据,而无需客户端发起请求。以下是 HTTP SSE 的主要特点: 单向通信: SSE 是一种单向通信协议,服务器可以主动向客户端推送数据,而客户端只能被动接收数据。 持久连接: SS…...

Spring-Retry 框架实战经典重试场景
Spring-Retry框架是Spring自带的功能,具备间隔重试、包含异常、排除异常、控制重试频率等特点,是项目开发中很实用的一种框架。 1、引入依赖 坑点:需要引入AOP,否则会抛异常。 xml <!-- Spring-Retry --> <dependency&…...
人工智能在医疗领域的应用与挑战
随着人工智能技术的不断发展,其在医疗领域的应用也越来越广泛。从辅助诊断到治疗决策,人工智能正在逐步改变着传统的医疗模式。然而,人工智能在医疗领域的应用也面临着诸多挑战,如数据隐私、伦理道德等问题。本文将探讨人工智能在…...

Windows下nmap命令及Zenmap工具的使用方法
一、Nmap简介 nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一,以及用以评…...
深入了解-什么是CUDA编程模型
CUDA(Compute Unified Device Architecture,统一计算架构)是NVIDIA推出的一种面向GPU的并行计算平台和编程模型。它允许开发者利用NVIDIA的GPU进行通用目的的并行计算,从而加速应用程序的运行速度。CUDA编程模型为开发者提供了强大…...
111111111111111111
11111111111111111111...

环境如何搭建部署Nacos
这里我使用的是Centos7, Nacos 依赖 Java环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用 ## 1、下载安装JDK wget https://download.oracle.com/java/17/latest/jdk-17_linux-x6…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...