当前位置: 首页 > news >正文

java—类反射机制

简述

        反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息(如成员变量,构造器,成员方法等),并能操作对象的属性及方法。反射机制在设计模式和框架底层都能用到。

        类一旦加载,在堆中会产生一个Class类型的对象,这个对象包含了类的完整结构信息。通过这个对象可以获得这个类的结构。

java反射机制相关类

         java作为面向对象的编程语言,万物皆对象,在反射机制中,将类的各个成员都当做一个类的对象

    ①java.lang.Class:Class对象表示某个类加载后在堆中的对象
    ②java.lang.reflect.Method:代表类的方法
    ③java.lang.reflect.Field:代表类的成员变量
    ④java.lang.reflect.Constructor:代表类的构造器

反射机制优缺点

优点:可以动态的创建和使用对象,使用灵活,反射机制就是框架的底层支撑
缺点:使用反射的运行效率较慢

反射机制优化

        关闭访问检查,Method,Field,Constructor均有setAccessible(boolean b)方法,作用是开启或关闭访问安全检查开关,参数为true时关闭访问检查,提高反射的效率;参数为false则表示开启访问检查

Class

①Class类也是一个类,只是类名就叫做Class,因此也继承Object类
②Class类对象不是new Class()的形式创建的,而是由系统创建
③对于某一个类的Class类对象,在内存中只有一份,因此类在内存中只加载一次
④通过Class类对象可以获取所加载类的所有接信息
⑤Class对象存放在堆中。

具有Class对象的类型

类,接口,数组,枚举,注解,基本数据类型,void

代码示例:

package com.flash.class_;import java.io.Serializable;/*** @author flash* @date 2024/06/18 18:08* 功能描述:枚举拥有 Class 对象的类型*/
public class AllTypeClass {public static void main(String[] args) {// 类Class<String> cls1 = String.class;// 接口Class<Serializable> cls2 = Serializable.class;// 一维数组Class<Integer[]> cls3 = Integer[].class;// 二维数组Class<float[][]> cls4 = float[][].class;// 注解Class<Deprecated> cls5 = Deprecated.class;// 枚举Class<Thread.State> cls6 = Thread.State.class;// 基本数据类型Class<Long> cls7 = long.class;// voidClass<Void> cls8 = void.class;// ClassClass<Class> cls9 = Class.class;System.out.println("cls1 = " + cls1);System.out.println("cls2 = " + cls2);System.out.println("cls3 = " + cls3);System.out.println("cls4 = " + cls4);System.out.println("cls5 = " + cls5);System.out.println("cls6 = " + cls6);System.out.println("cls7 = " + cls7);System.out.println("cls8 = " + cls8);System.out.println("cls9 = " + cls9);}
}

运行结果:

类加载

基本说明:反射机制是java实现动态语言的关键, 也就是通过反射实现类动态加载
        ①静态加载:编译时加载相关的类, 如果没有直接报错, 依赖性强
        ②动态加载:运行时加载需要的类, 如果运行时没有用到该类, 即使不存在这个类也不会报错, 依赖性较弱
类加载时机:
        ①当创建对象时(new) 静态加载
        ②当子类被加载时, 父类也被加载 静态加载
        ③调用类中的静态成员时 静态加载
        ④反射机制 动态加载

Class类对象创建方式

import com.flash.classReflex.Car;/*** @author flash* @date 2024/06/18 16:28* 功能描述:演示得到 Class类 对象的各种方式*/
public class CreateClassInstance {public static void main(String[] args) throws ClassNotFoundException {// 1.class.forNameString classAllPath = "com.flash.classReflex.Car";// 通过读取配置文件获取Class<?> cls1 = Class.forName(classAllPath);System.out.println("cls1 = " + cls1);// 2.类名.class, 应用场景: 用于参数传递Class<Car> cls2 = Car.class;System.out.println("cls2 = " + cls2);// 3.通过已有类调用 getClass() 方法, getClass()获得的就是这个对象关联的 Class 的对象Car car = new Car();Class<? extends Car> cls3 = car.getClass();System.out.println("cls3 = " + cls3);// 4.通过类加载器获取到类的 Class 对象, 共4种// 先得到类加载器 carClassLoader classLoader = car.getClass().getClassLoader();// 通过类加载器得到 Class 对象Class<?> cls4 = classLoader.loadClass(classAllPath);System.out.println("cls4 = " + cls4);// cls1, cls2, cls3, cls4 一模一样System.out.println("cls1.hashCode = " + cls1.hashCode());System.out.println("cls2.hashCode = " + cls2.hashCode());System.out.println("cls3.hashCode = " + cls3.hashCode());System.out.println("cls4.hashCode = " + cls4.hashCode());// 5.基本数据类型按如下方式跌倒CLass类对象Class<Integer> integerClass = int.class;Class<Character> characterClass = char.class;Class<Boolean> booleanClass = boolean.class;// 输出的还是基本数据类型, 有一个自动装箱、拆箱的过程System.out.println("integerClass = " + integerClass);// intSystem.out.println("characterClass = " + characterClass);// charSystem.out.println("booleanClass = " + booleanClass);// boolean// 6.基本数据类型对应的包装类, 可以通过 .TYPE 对到 Class类对象Class<Integer> type = Integer.TYPE;Class<Character> type1 = Character.TYPE;Class<Boolean> type2 = Boolean.TYPE;// 还是会自动装箱拆箱System.out.println("type = " + type);System.out.println("type1 = " + type1);System.out.println("type2 = " + type2);System.out.println("integerClass.hashCode = " + integerClass.hashCode());// 1163157884System.out.println("type.hashCode = " + type.hashCode());// 1163157884// 二者相等, 说明基本数据类型及他的包装类的 Class类对象 是同一个}
}

运行结果:

反射获取类的结构信息

代码示例:

// 测试所用类
class PersonDad {public String dept;public PersonDad() {}public PersonDad(String dept) {this.dept = dept;}public void dadMethod() {}
}interface PersonInterface {}@Deprecated // 弃用注解
class Person extends PersonDad implements PersonInterface {// 属性public String name = "JSON";protected int age = 20;String job = "study";private double sal = -100;static int a;final int b = 10;public Person() {}public Person(String name) {this.name = name;}private Person(String dept, String job) {super(dept);this.job = job;}protected Person(String name, String job, String dept) {super(dept);this.name = name;this.job = job;}public Person(String dept, String name, int age, String job, double sal) {super(dept);this.name = name;this.age = age;this.job = job;this.sal = sal;}// 方法public void m1(String name, int age) {}protected int m2() {return 0;}String m3() {return null;}private void m4() {}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", job='" + job + '\'' +", sal=" + sal +", b=" + b +'}';}
}

获取类名

package com.flash.class_;import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;/*** @author flash* @date 2024/06/19 14:05* 功能描述:通过反射获取类的结构信息*/
public class GetClassMessage {public static void main(String[] args) throws Exception {// 得到 Class 对象Class<?> personClass = Class.forName("com.flash.class_.Person");// getName:获取全类名System.out.println("获取全类名");System.out.println("name = " + personClass.getName());System.out.println("========================================");// getSimpleName:获取简单类名System.out.println("获取简单类名");System.out.println("SimpleName = " + personClass.getSimpleName());System.out.println("========================================");

运行结果:

获取属性

		// getFields:获取所有本类及其父类 public 修饰的属性System.out.println("获取所有本类及其父类 public 修饰的属性");for (Field field : personClass.getFields()) {System.out.println(field.getName());}System.out.println("========================================");// getDeclaredFields:获取本类所有属性, 只有本类的System.out.println("获取本类所有属性, 只有本类的");for (Field declaredField : personClass.getDeclaredFields()) {/*属性修饰符的值说明:默认修饰符: 0public: 1private: 2protected: 4static: 8final :16多修饰符时值相加*/System.out.println(declaredField.getType().getSimpleName() + " " + declaredField.getName() + " 属性修饰符的值 = " + declaredField.getModifiers());}System.out.println("========================================");

运行结果:

获取方法

        // getMethods:获取本类及其父类 public 方法System.out.println("获取本类及其父类 public 方法");for (Method method : personClass.getMethods()) {System.out.println(method.getName());}System.out.println("========================================");// getDeclaredMethods:获取本类所有方法, 只有本类的System.out.println("获取本类所有方法, 只有本类的");for (Method declaredMethod : personClass.getDeclaredMethods()) {System.out.println(declaredMethod.getReturnType().getSimpleName() + " " + declaredMethod.getName() + " 方法修饰符的值 = " + declaredMethod.getModifiers());System.out.print("参数:");for (Class<?> parameterType : declaredMethod.getParameterTypes()) {System.out.print(parameterType.getSimpleName() + " ");}System.out.println();}System.out.println("========================================");

运行结果:

获取构造器

        // getConstructors:获取本类 public 构造器System.out.println("获取本类 public 构造器");for (Constructor<?> constructor : personClass.getConstructors()) {System.out.println(constructor.getName());}System.out.println("========================================");// getDeclaredConstructors:获取本类所有构造器System.out.println("获取本类所有构造器");for (Constructor<?> declaredConstructor : personClass.getDeclaredConstructors()) {System.out.println(declaredConstructor.getName());System.out.print("参数:");for (Class<?> parameterType : declaredConstructor.getParameterTypes()) {System.out.print(parameterType.getSimpleName() + " ");}System.out.println();}System.out.println("========================================");

运行结果:

获取包信息、父类、实现接口、注解信息

        // getPackage:获取包信息System.out.println("获取包信息");System.out.println("Package = " + personClass.getPackage());System.out.println("========================================");// getSuperclass:获取父类System.out.println("获取父类");System.out.println(personClass.getSuperclass());System.out.println("========================================");// getInterfaces:获取本类实现的接口System.out.println("获取本类实现的接口");for (Class<?> anInterface : personClass.getInterfaces()) {System.out.println(anInterface.getName());}System.out.println("========================================");// getAnnotations:获取注解信息System.out.println("获取注解信息");for (Annotation annotation : personClass.getAnnotations()) {System.out.println("annotation = " + annotation);}}
}

运行结果:

反射创建实例对象

package com.flash.class_;import java.lang.reflect.Constructor;/*** @author flash* @date 2024/06/19 15:11* 功能描述:通过反射创建对象*/
public class CreateInstance {public static void main(String[] args) throws Exception {// 1.获取 Person 类的 Class对象Class<?> userClass = Class.forName("com.flash.class_.Person");// 2.通过public无参构造器创建实例对象Object o = userClass.newInstance();System.out.println("o = " + o);// 3.通过public构造器创建实例对象// 3.1 创建对应构造器Constructor<?> constructor = userClass.getConstructor(String.class);/*此时 constructor构造器 对应public Person(String name) {this.name = name;}*/// 3.2 通过刚才创建的构造器对象传入实参创建对应对象Object o1 = constructor.newInstance("张三");System.out.println("o1 = " + o1);// 4.调用非public构造器// 4.1 创建对应构造器Constructor<?> declaredConstructor = userClass.getDeclaredConstructor(String.class, String.class);// 4.2 本身不能使用 私有 的构造器, 可以设置允许使用, 暂时先理解为暴力破解declaredConstructor.setAccessible(true);// 4.3 创建对象Object o2 = declaredConstructor.newInstance("山理工", "李四");System.out.println("o2 = " + o2);System.out.println(userClass.getField("dept").get(o2));// 5.试一下protectedConstructor<?> constructor1 = userClass.getDeclaredConstructor(String.class, String.class, String.class);// 非私有的构造方法方法不需要破解也可以使用Object o3 = constructor1.newInstance("老六", "happy", "打妖怪");System.out.println("o3 = " + o3);System.out.println(userClass.getField("dept").get(o3));}
}

运行结果:

反射访问属性

package com.flash.class_;import java.lang.reflect.Field;/*** @author flash* @date 2024/06/19 16:13* 功能描述:反射访问类中的属性及修改*/
public class AskProperty {public static void main(String[] args) throws Exception {Class<?> stuClass = Class.forName("com.flash.class_.Student");Object o = stuClass.newInstance();// o的运行类型已经是 Student 了System.out.println("o的运行类型 = " + o.getClass());// 使用反射得到 age 属性对象Field age = stuClass.getField("age");age.set(o, 88);System.out.println(o);// 使用反射操作 name 属性, 私有且静态Field name = stuClass.getDeclaredField("name");// 破解name.setAccessible(true);// 赋值name.set(null, "JSON");// 可以为 null, 因为 name 属性就是静态的// name.set(o, "JSON");// 输出System.out.println(o);// 获取单一属性System.out.println(name.get(o));// 获取属性 name 的值}
}class Student {private static String name;public int age;public Student() {}private static String staticMethod() {System.out.println("我是私有的静态方法");return "私有的静态方法";}public void hi(String s) {System.out.println("hi~" + s);}@Overridepublic String toString() {return "Student{" +"name=" + name + ", " +"age=" + age +'}';}
}

运行结果:

反射调用方法

package com.flash.class_;import java.lang.reflect.Method;/*** @author flash* @date 2024/06/19 16:24* 功能描述:通过反射调用方法*/
public class UseMethod {public static void main(String[] args) throws Exception {Class<?> stuClass = Class.forName("com.flash.class_.Student");// 创建一个 Student 对象
//        Object o = stuClass.newInstance();Object o = stuClass.getConstructor().newInstance();// 调用 public 方法Method hi = stuClass.getMethod("hi", String.class);
//        Method hi = stuClass.getDeclaredMethod("hi", String.class);// 调用 对象o 的 hi 方法hi.invoke(o, "JSON");// 调用私有的静态方法Method staticMethod = stuClass.getDeclaredMethod("staticMethod");// 爆破staticMethod.setAccessible(true);// 调用方法Object invoke = staticMethod.invoke(null);// 返回类型统一为 Object类型, 运行类型该是什么还是什么System.out.println("返回值invoke运行类型: " + invoke.getClass());System.out.println("invoke = " + invoke);
//        System.out.println(staticMethod.invoke(o));// 因为是静态方法, 所以有没有指定对象都可以调用}
}

运行结果:

相关文章:

java—类反射机制

简述 反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息&#xff08;如成员变量&#xff0c;构造器&#xff0c;成员方法等&#xff09;&#xff0c;并能操作对象的属性及方法。反射机制在设计模式和框架底层都能用到。 类一旦加载&#xff0c;在堆中会产生…...

浏览器-服务器架构 (BS架构) 详解

目录 前言1. BS架构概述1.1 BS架构的定义1.2 BS架构的基本原理 2. BS架构的优势2.1 客户端简化2.2 易于更新和维护2.3 跨平台性强2.4 扩展性高 3. BS架构的劣势3.1 网络依赖性强3.2 安全性问题3.3 用户体验局限 4. BS架构的典型应用场景4.1 企业内部应用4.2 电子商务平台4.3 在…...

微型操作系统内核源码详解系列五(四):cm3下svc启动任务

系列一&#xff1a;微型操作系统内核源码详解系列一&#xff1a;rtos内核源码概论篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列二&#xff1a;微型操作系统内核源码详解系列二&#xff1a;数据结构和对象篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列…...

筛质数(暴力法、埃氏筛、欧拉筛)

筛质数&#xff08;暴力法、埃氏筛、欧拉筛&#xff09; 暴力法 思路分析&#xff1a; 直接双for循环来求解质数 如果不设置标记只是简单地执行了break会导致内部循环(由j控制)而不是立即打印i或者跳过它。如果打印语句写到内部循环中&#xff0c;也会导致每个 非素数也被打…...

使用USI作为主SPI接口

代码; lcd_drive.c //***************************************************************************** // // File........: LCD_driver.c // // Author(s)...: ATMEL Norway // // Target(s)...: ATmega169 // // Compiler....: AVR-GCC 3.3.1; avr-libc 1.0 // // D…...

AI播客下载:Eye on AI(AI深度洞察)

"Eye on A.I." 是一档双周播客节目&#xff0c;由长期担任《纽约时报》记者的 Craig S. Smith 主持。在每一集中&#xff0c;Craig 都会与在人工智能领域产生影响的人们交谈。该播客的目的是将渐进的进步置于更广阔的背景中&#xff0c;并考虑发展中的技术的全球影响…...

Flink 窗口触发器

参考&#xff1a; NoteWarehouse/05_BigData/09_Flink(1).md at main FGL12321/NoteWarehouse GitHub Flink系列 9. 介绍 Flink 窗口触发器、移除器和延迟数据等 | hnbian https://github.com/kinoxyz1/bigdata-learning-notes/blob/master/note/flink/Window%26%E6%97%B6…...

Java面试题:解释线程间如何通过wait、notify和notifyAll方法进行通信

在 Java 中&#xff0c;线程间的通信可以通过 wait()、notify() 和 notifyAll() 这三个方法实现。这些方法是 Java 线程 Thread 类的一部分&#xff0c;它们与 synchronized 关键字一起使用&#xff0c;以实现线程间的协调。 基本概念 wait()&#xff1a;当一个线程执行到 wa…...

【机器学习 复习】第9章 降维算法——PCA降维

一、概念 1.PCA &#xff08;1&#xff09;主成分分析&#xff08;Principal ComponentAnalysis&#xff0c;PCA&#xff09;一种经典的线性降维分析算法。 &#xff08;2&#xff09;原理&#xff0c;这里以二维转一维为例&#xff0c;原来的平面变成了一条直线 这是三维变二…...

Ubuntu系统docker gpu环境搭建

Ubuntu系统dockergpu环境搭建 安装步骤前置安装安装指定版本的依赖包用docker官方脚本安装Docker-ce添加稳定仓库和GPG秘钥更新源 安装docker安装nvidia-docker2重启docker服务阿里云镜像加速 相关命令网络 docker常用命令镜像容器 docker相关问题解决方案使用wsl时docker的容器…...

网络安全-如何设计一个安全的API(安全角度)

目录 API安全概述设计一个安全的API一个基本的API主要代码调用API的一些问题 BasicAuth认证流程主要代码问题 API Key流程主要代码问题 Bearer auth/Token auth流程 Digest Auth流程主要代码问题 JWT Token流程代码问题 Hmac流程主要代码问题 OAuth比较自定义请求签名身份认证&…...

微积分-导数1(导数与变化率)

切线 要求与曲线 C C C相切于 P ( a , f ( a ) ) P(a, f(a)) P(a,f(a))点的切线&#xff0c;我们可以在曲线上找到与之相近的一点 Q ( x , f ( x ) ) Q(x, f(x)) Q(x,f(x))&#xff0c;然后求出割线 P Q PQ PQ的斜率&#xff1a; m P Q f ( x ) − f ( a ) x − a m_{PQ} \…...

最新PHP仿猪八戒任务威客网整站源码/在线接任务网站源码

资源介绍 老规矩&#xff0c;截图为亲测&#xff0c;前后台显示正常&#xff0c;细节功能未测&#xff0c;有兴趣的自己下载。 PHP仿猪八戒整站源码下载&#xff0c;phpmysql环境。威客开源建站系统&#xff0c;其主要交易对象是以用户为主的技能、经验、时间和智慧型商品。经…...

Windows安装配置jdk和maven

他妈的远程连接不上公司电脑&#xff0c;只能在家重新配置一遍&#xff0c;在此记录一下后端环境全部配置 Windows安装配置JDK 1.8一、下载 JDK 1.8二、配置环境变量三、验证安装 Windows安装配置Maven 3.8.8一、下载安装 Maven并配置环境变量二、设置仓库镜像及本地仓库三、测…...

电子SOP实施(MQTT协议)

架构图 服务与程序 用docker启动mqtt broker(服务器) 访问&#xff1a;http://192.168.88.173:18083/#/dashboard/overview 用户名&#xff1a;admin 密码&#xff1a;*** 消息发布者(查找sop的url地址&#xff0c;发布出去) 修改url&#xff0c;重新发布消息 import ran…...

【Unity导航系统】Navigation组件的概念及其使用示例

Unity中的NavMeshObstacle组件是一个用于动态障碍物的组件&#xff0c;它可以实时地影响导航网格&#xff08;NavMesh&#xff09;。当游戏对象附加了NavMeshObstacle组件时&#xff0c;它可以在AI进行路径规划时被识别为障碍物&#xff0c;从而让AI避开这些动态变化的障碍。 …...

vue-cli 根据文字生成pdf格式文件 jsPDF

1.安装jspdf npm install jspdf --save 2.下载ttf格式文件 也可以用C:\Windows\Fonts下的字体文件&#xff0c;反正调一个需要的ttf字体文件就行&#xff0c;但有的字体存在部分字体乱码现象 微软雅黑ttf下载地址&#xff1a; FontsMarket.com - Download Microsoft YaHei …...

【嵌入式DIY实例】-Nokia 5110显示DS3231 RTC数据

Nokia 5110显示DS3231 RTC数据 文章目录 Nokia 5110显示DS3231 RTC数据1、硬件准备与接线2、代码实现本文将介绍如何使用 ESP8266 NodeMCU 板和 DS3231 RTC 模块制作一个简单的数字实时时钟,其中可以使用连接到 NodeMCU 的两个按钮设置时间和日期,并将它们打印在诺基亚 5110 …...

【十三】图解mybatis缓存模块之装饰器模式

图解mybatis缓存模块之装饰器模式 简介 之前有写过一篇博客介绍过mybatis的缓存模块设计【九】mybatis 缓存模块设计-CSDN博客 &#xff0c;当时着重讲解的是mybatis种一级缓存和二级缓存&#xff0c;本次博客补充讲解一下装饰器模式的应用&#xff0c;本篇主要分两部分讲解&a…...

字节大神强推千页PDF学习笔记,弱化学历问题,已拿意向书字节提前批移动端!

主要问java&#xff0c;以及虚拟机&#xff0c;问了一点android 1.实习项目有关的介绍以及问题回答 2.反射与代理的区别&#xff0c;动态代理&#xff0c;静态代理&#xff0c;二者的区别&#xff0c;以及代理模式的UML图 3.字节码技术 4.虚拟机的双亲委派&#xff0c;以及好…...

Python爬虫-贝壳二手房“改进版”

前言 本文是该专栏的第31篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前的文章《Python爬虫-贝壳二手房》中,笔者有详细介绍,基于python爬虫采集对应城市的二手房数据。 而在本文,笔者将基于该项目案例的基础上,进行一个项目代码的“改进版”。 具体实…...

zookeeper学习、配置文件参数详解

zookeeper学习、配置文件参数详解 zookeeper 配置文件参数详解tickTime 、session 的过期时间、maxSessionTimeout 三者之间的关系initLimit&#xff0c;syncLimit什么区别minSessionTimeout 默认值,**他的单位是ms** zookeeper 配置文件参数详解 ZooKeeper 是一个分布式协调服…...

SVG 模糊效果

SVG 模糊效果 SVG(Scalable Vector Graphics,可缩放矢量图形)是一种基于XML的图像格式,用于描述二维图形。它是一种矢量图形格式,因此可以无限放大而不失真。SVG广泛应用于网页设计、动画制作和图形编辑等领域。本文将介绍SVG中一种特殊的效果——模糊效果,以及如何使用…...

Electron+vite+vuetify项目搭建

最近想用Electron来进行跨平台的桌面应用开发。同时想用vuetify作为组件&#xff0c;于是想搭建一个这样的开发环境。其中踩了不少坑&#xff0c;总是会出现各种的编译错误和问题&#xff0c;依赖的各种问题&#xff0c;搞了好久最终环境终于弄好可正常开发了。这里分享下快速搭…...

洛谷:P1085 [NOIP2004 普及组] 不高兴的津津

1. 题目链接 https://www.luogu.com.cn/problem/P1085 P1085 [NOIP2004 普及组] 不高兴的津津 2. 题目描述 题目描述&#xff1a;津津每天要上课还要上辅导班&#xff0c;每天学习超过8小时就不开心&#xff0c;帮忙检查下津津的下周日程安排&#xff0c;然后告诉我她哪天不高…...

Webpack4从入门到精通以及和webpack5对比_webpack现在用的是哪个版本

3.1 打包样式资源css-loader、style-loader… {// 匹配哪些文件test: /\.less$/,// 使用哪些loader进行处理use: [// use数组中loader执行顺序&#xff1a;从右到左&#xff0c;从下到上&#xff0c;依次执行(先执行css-loader)// style-loader&#xff1a;创建style标签&#…...

巴鲁夫MacroBuilder2.0.0.0软件巴鲁夫和使用手侧

巴鲁夫MacroBuilder2.0.0.0软件巴鲁夫和使用手侧...

分享:Javascript开源桌面环境-Puter

Puter这是一个运行在浏览器里的桌面操作系统&#xff0c;提供了笔记本、代码编辑器、终端、画图、相机、录音等应用和一些小游戏。该项目作者出于性能方面的考虑没有选择 Vue 和 React 技术栈&#xff0c;而是采用的 JavaScript 和 jQuery 构建&#xff0c;支持 Docker 一键部署…...

【idea-jdk1.8】使用Spring Initializr 创建 Spring Boot项目没有JDK8

信息差真可怕&#xff01; 很久没创建springboot项目&#xff0c;今天使用idea的Spring Initializr 创建 Spring Boot项目时&#xff0c;发现java版本里&#xff0c;无法选择jdk1.8&#xff0c;只有17、21、22&#xff1b;前段时间也听说过&#xff0c;springboot将放弃java8&a…...

647. 回文子串(leetcode)

647. 回文子串&#xff08;leetcode&#xff09; 题目描述 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中回文子串的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 示例1 输入&#xff1a;s “abc” 输出…...

wordpress文章显示数量/青岛百度网站排名

在电脑Windows10系统上安装Centos7&#xff0c;安装后找不到Windows7引导菜单。 原因&#xff1a;因为CentOS 7已采用新式的grub2系统&#xff0c;所以需要进入/boot/grub2目录后使用vi编辑grub.cfg文件。 解决方法一&#xff1a;修改Centos 7的Grub2引导&#xff0c;添加Windo…...

wordpress mxl-rpc服务/网站百度手机端排名怎么查询

导读《全民超神》计划将于3月27日凌晨0:00-8:00安卓、iOS同步停服更新。停服更新期间&#xff0c;所有召唤师都将无法进入游戏&#xff0c;更新版本后&#xff0c;各位召唤师将获得联盟赠予的更新版本福利&#xff1a;钻石*100、竞技币*300...《全民超神》计划将于3月27日凌晨0…...

建网站的软件 优帮云/优化seo深圳

1. 找出n个字符串中出现次数最多的字符串。 C/C: char* find(char **data&#xff0c;int n); Java: String find(String data[]); 说明: 1. data是字符串数组&#xff0c;n是数组中字符串的个数&#xff0c;返回值为出现次数最多的字符串。 2. 若结果有多个&#xff0c;返回任…...

跳网站查询的二维码怎么做/网络营销策划总结

题意&#xff1a; 每次可以选择一个区间&#xff08;连续相同的序列&#xff09;消除&#xff0c;得分为 len*len&#xff1b;问最大得分。 分析&#xff1a; 很容易想到是区间DP&#xff0c;但是不像普通的区间DP一样切割方式~~~ 如果定义 d[ i ][ j ] 区间&#xff0c;那么在…...

佛山正规企业网站排名优化/太原网站建设优化

fiddler;Charles;f12...

哪里有做彩票网站了/国内最近的新闻大事

为什么80%的码农都做不了架构师&#xff1f;>>> IE6下window.location.href"www.baidu.com"无法打开&#xff0c;改为window.location.href"http://www.baidu.com" 问题解决。 原因&#xff1a;IE6下window.location.href值必须写上完整的地址…...