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…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
