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

Java基础15-Java高级

十五、Java高级

单元测试、反射、注解、动态代理。

1、单元测试

定义:就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。

1.1 Junit单元测试框架

可以用来对方 法进行测试,它是第三方公司开源出来的(很多开发工具已经集成了Junit框架,比如IDEA)

优点:可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键 完成对全部方法的自动化测试,且各自独立。不需要程序员去分析测试的结果,会自动生成测试报告出来。

1.2 测试案例

某个系统,有多个业务方法,请使用Junit单元测试框架, 编写测试代码,完成对这些方法的正确性测试。

具体测试步骤:

  1. 将Junit框架的jar包导 入到项目中(注意: IDEA集成了Junit框架,不需要我们自己手工导入了)
  2. 为需要测试的业务类,定义对应的测试类,并为每个业务方法,编写对应的测试方法(必须:公共、无参、无返回值)
  3. 测试方法 上必须声明@Test注解,然后在测试方法中,编写代码调用被测试的业务方法进行测试。
  4. 开始测试: 选中测试方法,右键选择"JUnit运行”,如果测试通过则是绿色;如果测试失败,则是红色。

1、只测试某个方法:直接点击该方法的左侧运行按钮运行即可

2、测试该测试类的所以方法:点击该参数类的左侧运行按钮运行即可

3、要测试该项目的所以测试类:直接右击该项目名——>点击 run All Tests

//工具类
public class Function {//获取字符串长度public static int getStringLenght(String str){if(str==null){return 0;}return str.length();}//获取字符串最后一个字母的索引public static int  getStringMaxIndex(String  str){if(str==null){return -1;}return str.length();}
}
//工具类的测试类
//点击在测试类左侧的运行按钮就测试所以的方法
public class FunctionTest {@Test  //测试类(点击左侧的运行按钮即可运行所对应的方法)//保证方法是(public、无返回值、无形参)public void getStringLenghtTest(){//直接调用要测试的方法(这里写的是静态方法,直接通过类名调取)int len= Function.getStringLenght("hello");int len2=Function.getStringLenght(null);System.out.println(len);System.out.println(len2);}@Testpublic void getStringMaxIndexTest(){int index1=Function.getStringMaxIndex("hello");int index2=Function.getStringMaxIndex(null);System.out.println(index1);System.out.println(index2);  //会发现测试没有报错,但是结果可能有问题。//可以使用结果断言,就是可以用自己的预测结果和方法得出的结果进行比较,看看是不是一样的。//参数(有误时的提示信息,自己预测结果,方法得出的结果)Assert.assertEquals("测试结果有误:",4,index1);}
}
Junit单元测试常见注解说明
@Test测试类中的方法必须用它修饰才能成为测试方法,才能启动执行
@Before Junit5改名为 ( @BeforeEach)用来修饰一个实例方法,该方法会在每一个测试方法执行之前执行一次。
@After Junit5改名为 (@BeforeEach)用来修饰一个实例方法,该方法会在每一个测试方法执行之后执行一次。
@BeforeClass Junit5改名为(@BeforeAll )用来修饰一个静态方法,该方法会在所有测试方法之前只执行一次。
@AfterClass Junit5改名为(@AfterAll)用来修饰一个静态方法,该方法会在所有测试方法之后只执行一次。

在测试方法执行前执行的方法,常用于:初始化资源。

在测试方法执行完后再执行的方法,常用于:释放资源。

2、反射

反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)。

作用:反射主要是用来做框架的

学习获取类的信息、操作它们,实现步骤:

  1. 反射第一步:加载类,获取类的字节码: Class对象
  2. 获取类的构造器:Constructor对象
  3. 获取类的成员变量:Field对象
  4. 获取类的成员方法::Method对象
2.1 反射第一步:加载类,获取类的字节码: Class对象

获取Class对象的三种方式:

  1. Class c1 =类名.class
  2. 调用Class提供方 法: public static Class forName(String package);
  3. Object提供的方法: public Class getClass(); Class c3 =对象.getClass();
public class Student {private String name;private String sex;private  int  age;
}
//测试类
public class ReflectTest {public static void main(String[] args) throws Exception {//Class  c1 =类名.classClass c1=Student.class;System.out.println(c1.getName());  //获取全类类名(包名加类名)System.out.println(c1.getSimpleName()); //获取简单类名(类名)//调用Class提供方 法: public static Class forName(String package);Class c2=Class.forName("akc4.reflect.Student");  //参数为全类类名System.out.println(c1==c2);  //等到的都是同一个类(true)//Object提供的方法: public Class getClass(); Class c3 =对象.getClass();Student  student=new Student();Class c3=student.getClass();System.out.println(c2==c3);  //等到的都是同一个类(true)}
}
2.2 获取类的构造器:Constructor对象
Class提供了从类中获取构造器的方法说明
Constructor<?> [ ] getConstructors()获取全部构造器(只能获取public修饰的)
Constructor<?> [ ] getDeclaredConstructors()获取全部构造器(只能存在就能拿到)
Constructor getConstructor(Class<?> … parmeterTypes )获取某个构造器(只能获取public修饰的)
Constructor getDeclaredConstructor( Class<?> … paramerTyoes )获取某个构造器(只要存在就能拿到)
//学生实体类
public class Student {private String name;private String sex;private  int  age;public Student() {}private Student(String name, String sex) {this.name = name;this.sex = sex;}public Student(String name, String sex, int age) {this.name = name;this.sex = sex;this.age = age;}
}
//测试类
public class StudentTest {@After  //每个测试方法结束后都会执行public void soutAfter(){System.out.println("---------------");}//获取多少构造器@Testpublic void testGetConstructors(){//1、获取到对应类的类Class对象Class  c1=Student.class;//2、通过 getConstructors()方法获取到所有用public修饰的构造器Constructor[] cons1=c1.getConstructors();for (Constructor constructor : cons1) {//获取构造器名和形参个数System.out.println(constructor.getName()+"--->"+constructor.getParameterCount());}System.out.println("============");//3、通过getDeclaredConstructors() 方法获取所有的构造器(一般用这个获取多个构造器)Constructor[] cons2=c1.getDeclaredConstructors();for (Constructor constructor : cons2) {//获取构造器名和形参个数System.out.println(constructor.getName()+"--->"+constructor.getParameterCount());}}@Testpublic void testGetDeclaredConstructor() throws Exception {//1、获取对应类的ClassClass c2=Student.class;//2、通过getConstructor(形参类型)方法获取public修饰的某个构造器Constructor con1=c2.getConstructor(); //获取无参构造器(public修饰的)//获取public修饰的形参为三个,且形参类型对应的构造器Constructor  cons2=c2.getConstructor(String.class,String.class,int.class);//获取指定的任何一个构造器,不限修饰类型Constructor  cons3=c2.getDeclaredConstructor(String.class,String.class);System.out.println(con1.getName()+" "+cons2.getName()+" "+cons3.getName());}}

获取类构造器的作用:依然是初始化对象返回

Constructor对象提供的方法说明
T newIntstance(Object…initargs)调用此构造器对象表示的构造器,并传入参数,完成对象的初始化并返回
public void setAccessible( boolean flag )设置为true,表示禁止检查访问控制,就是即使是私有的构造器也能访问(暴力反射)
//学生实体类
public class Student {private String name;private String sex;private  int  age;public Student() {System.out.println("无参构造器被调用了");}private Student(String name, String sex) {this.name = name;this.sex = sex;}public Student(String name, String sex, int age) {this.name = name;this.sex = sex;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", sex='" + sex + '\'' +", age=" + age +'}';}
}
//测试类
public class StudentTest {@Testpublic void testGetDeclaredConstructor() throws Exception {//1、获取对应类的ClassClass c2=Student.class;//2、通过getConstructor(形参类型)方法获取public修饰的某个构造器Constructor con1=c2.getConstructor(); //获取无参构造器(public修饰的)//获取public修饰的形参为三个,且形参类型对应的构造器Student student=(Student) con1.newInstance();  //没有写参数调用的就是无参构造器System.out.println(student);//获取指定的任何一个构造器,不限修饰类型Constructor  cons3=c2.getDeclaredConstructor(String.class,String.class);cons3.setAccessible(true); //暴力反射, 即使是private修饰的也能调用了                          Student student1=(Student) cons3.newInstance("小明","男");System.out.println(student1);}}
2.3 获取类的成员变量:Field对象

Class提供了从类中获取成员变量的方法

方法说明
public Field[ ] getFields()获取类id全部成员变量(只能获取public修饰的)
public Field[ ] getDeclaredields()获取类的全部成员变量(只要存在就能拿到)
public Field getField(Sting name)获取类的某个成员变量(只能获取public修饰的)
public Field getDeclaredField(String name)获取类的某个成员变量(只要存在就能拿到)

获取到成员变量的作用:依然是赋值、取值。

方法说明
void set(Object obj , Object value)赋值
Object get( Object obj )取值
public void setAccessible( boolean flag )设置true ,表示禁止检查访问控制(暴力反射)
//实体类
public class Student {public  String name;public   String  id;private String sex;private  int  age;public Student() {}
}
//测试类
public class StudentTest {@After  //每个测试方法结束后都会执行public void soutAfter(){System.out.println("---------------");} 
@Testpublic  void  testFields(){//1、获取到对应类的Class对象Class c=Student.class;//2、获取到所有用public修饰的成员变量Field[] fields=c.getFields();//3、遍历拿到的成员变量for (Field field : fields) {//输出变量名和变量类型System.out.println(field.getName()+"==>"+field.getType());}System.out.println("==========");//2、获取全部成员变量Field[] fields1=c.getDeclaredFields();//3、遍历拿到的成员变量for (Field field : fields1) {//输出变量名和变量类型System.out.println(field.getName()+"==>"+field.getType());}}@Testpublic  void  testField() throws Exception {//1、获取到对应类的Class对象Class  c1=Student.class;//2、获取public修饰的某个成员变量(成员变量名)Field field= c1.getField("name");System.out.println(field.getName()+"==>"+field.getType());System.out.println("============");//2、获取某个成员变量。不限修饰(成员变量名)Field field1=c1.getDeclaredField("age");System.out.println(field1.getName()+"==>"+field1.getType());//3、为成员变量赋值//3.1 创建一个对象Student student=new Student();//由于field1对应的age是私有的成员变量,所以要暴力反向field1.setAccessible(true);//赋值(要赋值的具体对象,符的值)field1.set(student,20);//获取值int  age=(int)field1.get(student);System.out.println(age);}
}
3.4 获取类的成员方法::Method对象

Class提供了从类中获取成员方法的API。

方法说明
Method[ ] getMethod()获取类的全部成员方法(只能获取public修饰的)
Method[ ] getDeclaredMethods()获取类的全部成员方法(只要存在就能拿到)
Method getMethod(String name, Class<?> … parameterTypes)获取类的某个成员方法(只能获取public修饰的)参数:(方法名,参数类型,如:String.class)
Method getDeclaredMethod(String name , Class<?> … parameterType )获取类的某个成员方法(只要存在就能拿到)参数:(方法名,参数类型,如:String.class)

成员方法的作用:依然是执行

Method提供的方法说明
public Object invoke( Object obj , Object … args )触发某个对象的该方法执行
public void setAccessible( boolean flag )设置true,表示禁止检查访问控制(暴力反射)
//实体类
public class Student {private String name;private String sex;private  int  age;public Student() {}private  String run(int num){return "跑"+num+"圈操场!";}
}
//测试类 
public class StudentTest {@Testpublic void testMethod() throws Exception {//1、创建一个类,对应的ClassClass  c=Student.class;//获取某个方法,不限修饰,参数为:要获取方法的方法名,形参列表的各个类型Method method= c.getDeclaredMethod("run",int.class);//2、由于run方法是私有的所以要暴力反向method.setAccessible(true);//3、获取某个方法,需要一个对应对象Student student=new Student();//4、调用该方法,并传入参数(要调用对象的对象名,调用方法的参数)String  str=  (String) method.invoke(student,10);System.out.println(str);}}
3.5 反射的运用场景

基本作用:可以得到一个类的全部成分然后操作。可以破坏封装性。

最重要的用途是:适合做Java的框架,基本上,主流的框架都会基于反射设计出- -些通用的功能。

使用反射做一个简易版的框架

需求:对于任意一个对象,该框架都可以把对象的字段名和对应的值,保存到文件中去。

实现步骤:

①定义一个方法,可以接收任意对象。

②每收到一个对象后,使用反射获取该对象的Class对象,然后获取全部的成员变量。

③遍历成员变量,然后提取成员变量在该对象中的具体值。

④把成员变量名、和其值,写出到文件中去即可。

3、注解( Annotation )

就是Java代码里的特殊标记,比如: @Override、 @Test等,作用是:让其他程序根据注解信息来决定怎么执行该程序。
注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处。

3.1 自定义注解
//自定义注解格式
public   @interface  注解名称{public  属性类型  属性名()  default  默认值;
}
//注解
public @interface MyTest {//默认public可以不写public String  name();//可以写默认值(写了,在赋值的时候可以不写)int  age() default 10;String[] hobby();
}
//测试注解
@MyTest(name="小明",age=19,hobby={"唱","跳","篮球"})
public class AnnotationTest {public static void main(String[] args) {}@MyTest(name="小红",hobby={"唱","跳","篮球"})public static void run(){}
}

1、特殊属性名: value

如果注解中只有一个value属性,使用注解时, value名称可以不写!

2、注解的本质

注解本质是一个接口,Java中所有注解都是继承了Annotation接口的。

@注解(…):其实就是一个实现类对象,实现了该注解以及Annotation接口。

3.2 元注解

是指的是修饰注解的注解

常用的2个元注解:@Target@Retention

@Retention( Retent ionPol icy . RUNTIME )   //元注解1
@Target({ElementType .METHOD})             //元注解2
public @interface Test {
}
3.2.1 @Target 元注解

作用:声明被修饰的注解只能在哪些位置使用。

//格式
@Target(ElementType.TYPE)
public @interface Test {  }
  1. TYPE:类、接口;
  2. FIELD:成员变量;
  3. METHOD:成员方法
  4. PARAMETER:方法参数;
  5. CONSTRUCTOR:构造器;
  6. LOCAL_VARIABLE:局部变量;
//限定修饰类型为成员变量
@Target(ElementType.FIELD)
public @interface MyTest {String  value();
}
public class AnnotationTest {//现在只能修饰成员变量了@MyTest("hello")private String name;
}
3.2.2 Retention 元注解

作用:声明注解的保留周期。

//格式
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {  }
  1. SOURCE:只作用在源码阶段,字节码文件中不存在。
  2. CLASS(默认值):保留到字节码文件阶段,运行阶段不存在。
  3. RUNTIME(开发常用):一直保留到运行阶段。
//一直保留到运行阶段
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {String  value();
}
public class AnnotationTest {//现在只能修饰成员变量了@MyTest("hello")private String name;
}
3.2.2 注解的解析

定义:就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来。

指导思想:要解析谁上面的注解,就应该先拿到谁。比如要解析类上面的注解,则应该先获取该类的Class对象,再通过Class对象解析其上面的注解。比如要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method对象解析其上面的注解。

Class、Method 、Field , Constructor.都实现了AnnotatedElement接口,它们都拥有解析注解的能力。

AnnotatedElement接口提供的解析注解方法说明
public Anotation[ ] getDeclaredAnnotations()获取当前对象上面的注解
public T getDeclaredAnnotation(Class annottationClass)获取指定的注解对象
public boolean isAnnotationPresent(Class annotationClass)判断当前对象上是否存在某个注解

解析注解案例:

①定义注解MyTest4, 要求如:
➢包含属性: String value()
➢包含属性: double aaa(),默认值为100
➢包含属性: String[] bbb()
➢限制注解使用的位置: 类和成员方法上
➢指定注解的有效范围: - -直到运行时

②定义一个类叫: Demo,在类中定义一个test1方法, 并在该类和其方法.上使用MyTest4注解

③定义AnnotationTest3测试类 ,解析Demo类中的全部注解。

//自定义注解
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {String  value();double  aaa() default 100;String[]  bbb();
}
//使用注解的类
@MyTest(value = "java",aaa=120,bbb = {"python","HTML"})
public class Demo {@MyTest(value = "JS",bbb = {"C语言","C++"})public void test1(){}
}
//测试类
public class AnnotationTest {@Testpublic void testClassAnnotation(){//1、获取到对应类的对象Class c=Demo.class;//2、解析类上的注解// 判断类对象是否有对应的注解if (c.isAnnotationPresent(MyTest.class)){//3、获取到类上的注解对象MyTest myTest=(MyTest) c.getDeclaredAnnotation(MyTest.class);//4、通过类上的对象获取到对应的参数System.out.println(myTest.value());System.out.println(myTest.aaa());System.out.println(Arrays.toString(myTest.bbb()));}}@Testpublic void testMethodAnnotation() throws Exception {//1、获取到对应的类对象Class c=Demo.class;//2、获取到类的Method对象Method m=c.getDeclaredMethod("test1");//3、判断方法上是否有对应的注解if(m.isAnnotationPresent(MyTest.class)){//4、获取到注解的对象MyTest myTest=(MyTest)m.getDeclaredAnnotation(MyTest.class);//5、通过注解对象获取获取到方法上注解的参数System.out.println(myTest.value());System.out.println(myTest.aaa());System.out.println(Arrays.toString(myTest.bbb()));}}
}
3.2.3 注解的运用场景

需求:定义若干个方法,只要加了MyTest注解,就会触发该方法执行。

分析:

①定义一个自定义注解MyTest,只能注解方法,存活范围是一直都在。

②定义若干个方法,部分方法加.上@MyTest注解修饰,部分方法不加。

③模拟一个junit程序,可以触发加了@MyTest注解的方法执行。

//注解
@Target(ElementType.METHOD)        //只能方法才能使用的注解
@Retention(RetentionPolicy.RUNTIME)   //触发范围:一直到运行阶段
public @interface MyTest {
}
public class Demo {//定义一下方法,要求只有加了注解的方法才能触发@MyTest()public void test1(){System.out.println("=======test1=======");}@MyTestpublic void test2(){System.out.println("=======test2=======");}public void test3(){System.out.println("=======test3=======");}@MyTestpublic void test4(){System.out.println("=======test4=======");}public static void main(String[] args) throws Exception{//1、获取到类这个Class对象Class c= Demo.class;//2、通过类对象获取到类对象里面的所有方法Method[] methods= c.getDeclaredMethods();//3、通过遍历获取到里面的每一个方法for (Method method : methods) {//4、判断里面的每一个方法是否带有注解if(method.isAnnotationPresent(MyTest.class)){//5、创建一个要被执行方法的对象,将这个对象作为参数Demo demo=new Demo();//执行带有注解的这个方法method.invoke(demo);}}}}

4、动态代理

代理是一种设计模式,它提供了一种机制,通过代理对象来访问目标对象,从而在不修改原始对象的基础上添加额外的功能或限制访问。

java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法:

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)/*
参数一:用于指定用哪个类加载器,去加载生成的代理类
参数二:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法
参数三:用来指定生成的代理对象要干什么事情*/

案例:蔡徐坤他有很多的才艺(唱歌,跳舞,打篮球…),但是呢,他肯定不会白白的在大众面向做这些,肯定是要收钱的,而且还要准备舞台什么的;他又不会去自己去收钱、搭建舞蹈什么的,因为他只负责唱、跳等,自己擅长的领域,这时其它的工作就会交给代理去做,代理做好前期工作后,代理才叫他来展示他的才艺。下面是实现代码:

//大明星的才艺接口
public interface Star {String sing(String singname);void  dance();void basketball();
}
//大明星类
//大明星要学习这些才艺(实现接口的方法)
public class BigStar implements Star {private  String name;public BigStar(String name) {this.name = name;}//创建2个方法public String sing(String singName){System.out.println(this.name+" 唱完了 "+singName);return "唱得怎么样?谢谢!谢谢!";}public void  dance(){System.out.println(this.name+" 跳了");}public void basketball(){System.out.println(this.name+" 打篮球了");}
}
//一个代理工具类(大明星可以在这里找代理)
public class ProxyUtil {//1、创建一个静态方法,用来完成代理工作,接收一个大明星类(就是为bigStar做代理)public static  Star  createProxy(BigStar bigStar){//2、创建一个代理对象/*Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)参数1:用于指定一个类加载器(一般就行写这个类的类加载器)参数2:指定生成的代理长什么样子,也就是有哪些方法(是一个数组装其来的),由于这里只接收一个方法,就把它直接放到数组里去参数3:用于指定生成的代理要做什么事情,它是一个接口,所以要不能直接创建对象,就new一个匿名内部类对象来指定代理对象做什么事情*/Star starProxy=(Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), new Class[]{Star.class}, new InvocationHandler() {//invoke方法:等一下会去main方法调用这个工具类,将bigStar对象作为参数,得到一个Star对象,再通过Star对象调用sing和dance方法,调用这两个方法就会去调用invoke方法。//sing和dance方法被调用时,也会把3个参数填到invoke方法中//参数1:java会把当前的代理对象当作一个Object对象放到其中//参数2:java会把,调用的方法当作Method传进来,如果外面在调用sing方法,那么method就是sing方法//参数3:被调用方法的参数,java会把被调用的方法的产生传到args数组中@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//代理对象要做的事情,会在这里写代码//1、通过method来判断,被调用的是哪个方法if(method.getName().equals("sing")){System.out.println("准备话筒,收100块!");//2、执行被代理发方法(参数为:被代理的对象,被调用方法的参数),有返回值的直接返回return method.invoke(bigStar,args);}else if(method.getName().equals("dance")){System.out.println("准备一个舞台!收20块!");//2、执行被代理发方法(参数为:被代理的对象,被调用方法的参数)return method.invoke(bigStar,args);}else {//其它方法return   method.invoke(bigStar,args);}}});//将代理对象返回出去return starProxy;}
}
//测试类(大明星展示才艺类)
public class Test {public static void main(String[] args) {//通过有参构造器创建一个需要被代理的对象(创建了蔡徐坤大明星)BigStar bigStar=new BigStar("蔡徐坤");//调用代理工具类静态方法,创建一个代理对象,将需要被代理的对象传过去(蔡徐坤找来一个代理)Star star=ProxyUtil.createProxy(bigStar);//通过代理对象,调用代理方法String str = star.sing("鸡你太美");System.out.println(str);//通过代理对象,调用代理方法star.dance();            //通过代理对象,调用代理方法star.basketball(); }
}

相关文章:

Java基础15-Java高级

十五、Java高级 单元测试、反射、注解、动态代理。 1、单元测试 定义&#xff1a;就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。 1.1 Junit单元测试框架 可以用来对方 法进行测试&#xff0c;它是第三方公司开源出来的(很多开发工具已经集成了Junit框架&…...

selenium工具的几种截屏方法介绍(9)

在使用selenium做自动化的时候&#xff0c;可以对于某些场景截图保存当时的执行情况&#xff0c;方便后续定位问题或者作为一些证据保留现场。 获取元素后将元素截屏 我们获取元素后&#xff0c;使用函数screenshot将元素截屏&#xff0c;参数filename传入完整的png文件名路径…...

【设计模式】深入理解Python中的过滤器模式(Filter Pattern)

深入理解Python中的过滤器模式&#xff08;Filter Pattern&#xff09; 在软件设计中&#xff0c;面对复杂的数据处理需求时&#xff0c;我们常常需要从一组数据中筛选出符合特定条件的子集。**过滤器模式&#xff08;Filter Pattern&#xff09;**是一种能够简化这种操作的设…...

vue的动态组件 keep-alive

1. 什么是动态组件 动态组件指的是 动态切换组件的显示与隐藏 2. 如何实现动态组件渲染 vue提供了一个内置的<component>组件&#xff0c;专门用来实现动态组件的渲染。 作用&#xff1a;组件的占位符is的值表示要渲染的组件 示例代码如下&#xff1a; Left.vue的代…...

现代框架开发官网

一、项目背景 维护过 灵犀官网、企业邮官网、免费邮官网 均使用 jquery webpack多页面打包的方式 开发起来较为繁琐 新的官网项目&#xff0c;想使用现代前端框架&#xff0c;但SPA应用不利于SEO 使用SSR方案又依赖运维&#xff0c;增加维护和沟通成本 二、SSG vs 预渲染 S…...

一篇文章快速认识YOLO11 | 关键改进点 | 安装使用 | 模型训练和推理

前言 本文分享YOLO11的关键改进点、性能对比、安装使用、模型训练和推理等内容。 YOLO11 是 Ultralytics 最新的实时目标检测器&#xff0c;凭借更高的精度、速度和效率重新定义了可能性。 除了传统的目标检测外&#xff0c;YOLO11 还支持目标跟踪、实例分割、姿态估计、OBB…...

AtCoder Beginner Contest 375(A,B,C,D,E,F)(大模拟,前缀和,dp,离线处理,Floyd)

比赛链接 AtCoder Beginner Contest 375 A题 代码 #pragma GCC optimize("O2") #pragma GCC optimize("O3") #include <bits/stdc.h> using namespace std; #define int long long const int N 2e5 5, M 1e6 5; const int inf 0x3f3f3f3f3f…...

认识maven

什么是 Maven&#xff1f; Maven 是一个开源的项目管理工具&#xff0c;主要用于 Java 项目的构建、依赖管理和项目生命周期管理。它提供了一种标准的项目结构和管理流程&#xff0c;使得开发人员能够更轻松地管理项目的构建过程&#xff0c;提高代码的可重用性和可维护性。 …...

OSINT技术情报精选·2024年10月第2周

OSINT技术情报精选2024年10月第2周 2024.10.16版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、亿欧智库&#xff1a;《2024中国高精定位服务产业白皮书》 报告的主要内容如下&#xff1a; 产业背景&#xff1a;在“北斗”发展态势的…...

中企通信赋能中信戴卡入选工信部颁发的2023年工业互联网试点示范名单

2024年10月17日&#xff0c;北京-随着工业互联网的迅猛发展&#xff0c;网络安全已成为国家关注的重点议题之一。日前&#xff0c;工业和信息化部&#xff08;工信部&#xff09;公布了2023年工业互联网试点示范名单&#xff0c;中企网络通信技术有限公司&#xff08;简称“中企…...

【C语言】函数的声明与定义

函数的声明 用户自定义函数需要在main函数之前进行声明&#xff0c;用分号结尾。 函数的定义 用户自定义函数在main函数之后进行定义&#xff0c;需要写出具体形参的变量名。注意函数的返回值和返回值类型要一一对应。 函数的调用 调用时&#xff0c;直接使用函数名进行调用&am…...

游戏如何应对薅羊毛问题

在大众眼里&#xff0c;“薅羊毛”是指在电商领域&#xff0c;“羊毛党”利用平台、商家的促销规则&#xff0c;低价获取商品和服务的行为。如前不久“小天鹅被一夜薅走7000万”的案例震惊全网。 然而实际上&#xff0c;“薅羊毛”现象不仅存在于电商场景&#xff0c;在游戏中…...

Chromium html<script>对应c++接口定义

<script>&#xff1a;脚本元素 <script> 元素用于嵌入可执行代码或数据&#xff0c;这通常用作嵌入或者引用 JavaScript 代码。<script> 元素也能在其他语言中使用&#xff0c;比如 WebGL 的 GLSL 着色器语言和 JSON。 更多参考&#xff1a;<script>&…...

ollama + fastgpt+m3e本地部署

ollama fastgptm3e本地部署 开启WSL更新wsl安装ubuntu docker下载修改docker镜像源开启WSL integration 安装fastgpt先创建一个文件夹来放置一些配置文件用命令下载fastgpt配置文件用命令下载docker的部署文件 启动容器M3E下载ollama下载oneapi配置登录oneapi配置ollama渠道配…...

Linux执行source /etc/profile命令报错:权限不够问(已解决)

1.问题 明明以root账号登录Linux系统&#xff0c;在终端执行命令source /etc/profile时 显示权限不够 如下图&#xff1a; 2.问题原因 可能在编辑 /etc/profile 这个文件时不小心把开头的 井号 ‘#’ 给删除了 如图&#xff1a; 这里一定要有# 3.解决办法 进入/etc/pro…...

Windows 11开发全解析

Windows 11开发全解析 一、搭建开发环境 在开始Windows 11开发之前&#xff0c;搭建一个高效的开发环境是至关重要的。Windows 11提供了多种工具和框架&#xff0c;可以帮助开发者快速搭建起一个强大的开发环境。 1. Visual Studio 2024 Visual Studio 2024是微软为Windows…...

如何进行数学家式的学习思考?

如何进行数学家式的学习思考&#xff1f; 学生阶段的数学学习是非常重要的&#xff0c;对这一点很少有人质疑。一提起数学学习&#xff0c;一些学生、家长甚至一些教师认为&#xff0c;学生的数学学习往往侧重于掌握基本概念、公式和解题技巧&#xff0c;通过做题来巩固知识和提…...

自定义类型--结构体

目录 1. 结构体类型的声明 1.1结构的声明 1.2 结构体变量的创建和初始化 1.3不完全结构体 1.4结构的⾃引⽤ 2 结构体的内存对齐 2.1offsetof 2.2 对⻬规则 2.3 为什么存在内存对⻬? 2.4修改默认对⻬数 3. 结构体传参 4 结构体实现位段 4.1什么是位段 4.2 位段的内…...

笔试练习day7

目录 OR59 字符串中找出连续最长的数字串题目解析解法(双指针遍历)代码 NC109 岛屿数量题目解析解法代码(dfs)dfs的实现 拼三角题目解析解法(枚举)代码 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &…...

python 爬虫 入门 一、基础工具

目录 一&#xff0c;网页开发者工具的使用 二、通过python发送请求 &#xff08;一&#xff09;、get &#xff08;二&#xff09;、带参数的get &#xff08;三&#xff09;、post 后续&#xff1a;数据解析 一&#xff0c;网页开发者工具的使用 我们可以用 requests 库…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)

目录 &#x1f50d; 若用递归计算每一项&#xff0c;会发生什么&#xff1f; Horners Rule&#xff08;霍纳法则&#xff09; 第一步&#xff1a;我们从最原始的泰勒公式出发 第二步&#xff1a;从形式上重新观察展开式 &#x1f31f; 第三步&#xff1a;引出霍纳法则&…...