JAVA 反射和动态管理(二十-完)

反射和动态管理(二十-完)

反射

反射允许对字段(成员变量),成员方法,构造方法的信息进行编程访问。

反射操作可分为获取解刨

获取不是从java文件获取,而是从class字节码文件获取。

作用

  1. 获取一个类里面的所有的信息,获取到后,再执行其他的业务逻辑
  2. 结合配置文件,动态的创建对象并调用方法

获取class对象

  1. Class.forname(“全类名”)
    • 全类名:包名+类名‘
    • 该方法是最为常用的
  2. 类名.class
    • 一般当做当前参数进行传递,比如synchronized(类名.class)
  3. 对象.getclass
    • 有该类的对象后,才可使用

范例

//Student.java
public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}
}//Test.java
public class Test {public static void main(String[] args) throws ClassNotFoundException {Class class1 = Class.forName("reflect.Student");System.out.println(class1);Class class2 = Student.class;System.out.println(class2);Student student=new Student();Class class3=student.getClass();System.out.println(class3);System.out.println(class1==class2);System.out.println(class2==class3);}
}
/*
class reflect.Student
class reflect.Student
class reflect.Student
true
true
*/

获取构造方法

Class类中用于获取构造方法的方法
getConstructors

Constructor<?>[] getConstructors()

说明:返回所有公共构造方法对象的数组

getDeclaredConstructors

Constructor<?>[] getDeclaredConstructors()

说明:返回所有构造方法对象的数组

getConstructor

Constructor getConstructor(Class<?>…parameterTypes)

说明:返回单个公共构造方法对象

getDeclaredConstructor

Constructor getDeclaredConstructor(Class<?>…parameterTypes)

说明:返回单个构造方法对象

Constructor类中用于创建对象的方法
newInstance

T newInstance(Object…initargs)

说明:根据指定的构造方法创建对象

setAccessible

setAccessible(boolean flag)

说明:设置为true,表示取消访问检查

范例
//Student.java
public class Student {private String name;private int age;public Student() {}public Student(String name) {this.name = name;}private Student(String name, int age) {this.name = name;this.age = age;}protected Student(int age){this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}
}//Test.java
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;public class Test {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {Class clazz = Class.forName("reflect.Student");//getConstructorsConstructor[] constructors1 = clazz.getConstructors();for (Constructor constructor:constructors1){System.out.println(constructor);}System.out.println();//getDeclaredConstructorsConstructor[] constructors2 = clazz.getDeclaredConstructors();for (Constructor constructor:constructors2){System.out.println(constructor);}System.out.println();//getConstructorConstructor constructor1 = clazz.getConstructor();System.out.println(constructor1);System.out.println();//getDeclaredConstructorConstructor constructor2 = clazz.getDeclaredConstructor(String.class,int.class);System.out.println(constructor2);System.out.println();System.out.println(constructor2.getModifiers());//获取权限修饰符,以数字的形式表现System.out.println();Parameter[] parameters = constructor2.getParameters();//获取参数for (Parameter parameter:parameters){System.out.println(parameter);}//newInstance和setAccessible//暴力反射:临时取消权限校验constructor2.setAccessible(true);//使private类型的构造方法可以创建Student student=(Student) constructor2.newInstance("张三",3);System.out.println(student);}
}
/*
public reflect.Student(java.lang.String)
public reflect.Student()protected reflect.Student(int)
private reflect.Student(java.lang.String,int)
public reflect.Student(java.lang.String)
public reflect.Student()public reflect.Student()private reflect.Student(java.lang.String,int)2java.lang.String arg0
int arg1
Student{name = 张三, age = 3}*/

获取成员变量

Class类中获取成员变量对象的方法
getFields

Field[] getFields()

说明:返回所有公共成员变量对象的数组

getDeclaredFields

Field[] getDeclaredFields()

说明:返回所有成员变量对象的数组

getField

Field getField(String name)

说明:返回单个公共成员变量对象

getDeclaredField

Field getDeclaredField(String name)

说明:返回单个成员变量对象

Field类中用于创建对象的方法
set

void set(Object obj,Object value)

说明:赋值

get

Object get(Object obj)

说明:获取值

范例
import java.lang.reflect.Field;public class Test {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {Class clazz=Class.forName("reflect.Student");//getFieldsField[] fields1 = clazz.getFields();for (Field field:fields1){System.out.println(field);}System.out.println();//getDeclaredFieldsField[] fields2 = clazz.getDeclaredFields();for (Field field:fields2){System.out.println(field);}System.out.println();//getFieldField field1=clazz.getField("sex");System.out.println(field1);System.out.println();//getDeclaredFieldField field2=clazz.getDeclaredField("name");System.out.println(field2);System.out.println();//getSystem.out.println(field1.getModifiers());//获取变量修饰符System.out.println(field1.getName());//获取变量名Class<?> type = field1.getType();//获取变量类型System.out.println(type);System.out.println();Student student=new Student("张三",18,"男");field2.setAccessible(true);String s=(String)field2.get(student);System.out.println(s);System.out.println();field2.set(student,"李四");System.out.println(student);}
}
/*
public java.lang.String reflect.Student.sexprivate java.lang.String reflect.Student.name
private int reflect.Student.age
public java.lang.String reflect.Student.sexpublic java.lang.String reflect.Student.sexprivate java.lang.String reflect.Student.name1
sex
class java.lang.String张三Student{name = 李四, age = 18, sex = 男}*/

获取成员方法

Class类中用于获取成员方法的方法
getMethods

Method[] getMethods()

说明:返回所有公共成员方法对象的数组,包括继承的

getDeclaredMethods

Method[] getDeclaredMethods()

说明:返回所有成员方法对象的数组,不包括继承的

getMethod

Method getMethods(String name,Class<?>…parameterTypes)

说明:返回单个公共成员方法对象

getDeclaredMethod

Method getDeclaredMethods(String name,Class<?>…parameterTypes)

说明:返回单个成员方法对象

Method类中用于创建对象的方法

Object invoke(Object obj,Object…args);运行方法

参数一:用obj对象调用该方法

参数二:调用方法的传递的参数(若无则不写)

返回值:方法的返回值(若无则不写)

范例
//Test.java
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;public class Test {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {Class clazz=Class.forName("reflect.Student");//getMethodsMethod[] methods1 = clazz.getMethods();for (Method method:methods1){System.out.println(method);}System.out.println();//getDeclaredMethodsMethod[] methods2=clazz.getDeclaredMethods();for(Method method:methods2){System.out.println(method);}System.out.println();//getMethodMethod study = clazz.getMethod("study", String.class);System.out.println(study);System.out.println();//getMethodsMethod eat = clazz.getDeclaredMethod("eat", String.class,String.class);System.out.println(eat);System.out.println();System.out.println(eat.getModifiers());//获取修饰符System.out.println(eat.getName());//获取名字Parameter[] parameters = eat.getParameters();for (Parameter parameter:parameters){System.out.println(parameter);}Class[] exceptionTypes = study.getExceptionTypes();for (Class ex:exceptionTypes){System.out.println(ex);}System.out.println();Student student=new Student("路人甲",8);eat.setAccessible(true);String result=(String)eat.invoke(student,"汉堡包","可乐");System.out.println(result);}
}
//Student
import java.io.IOException;public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}private String eat(String food,String drink){System.out.println(name+"正在吃"+food+",正在喝"+drink);return "排泄物";}private String eat(String food){System.out.println(name+"正在吃"+food);return "排泄物";}public void study(String name)throws IOException,ArrayIndexOutOfBoundsException {System.out.println(name+"正在学习");}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}
}/*
public java.lang.String reflect.Student.toString()
public java.lang.String reflect.Student.getName()
public void reflect.Student.setName(java.lang.String)
public int reflect.Student.getAge()
public void reflect.Student.setAge(int)
public void reflect.Student.study(java.lang.String) throws java.io.IOException,java.lang.ArrayIndexOutOfBoundsException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()public java.lang.String reflect.Student.toString()
public java.lang.String reflect.Student.getName()
public void reflect.Student.setName(java.lang.String)
public int reflect.Student.getAge()
public void reflect.Student.setAge(int)
private java.lang.String reflect.Student.eat(java.lang.String)
private java.lang.String reflect.Student.eat(java.lang.String,java.lang.String)
public void reflect.Student.study(java.lang.String) throws java.io.IOException,java.lang.ArrayIndexOutOfBoundsExceptionpublic void reflect.Student.study(java.lang.String) throws java.io.IOException,java.lang.ArrayIndexOutOfBoundsExceptionprivate java.lang.String reflect.Student.eat(java.lang.String,java.lang.String)2
eat
java.lang.String arg0
java.lang.String arg1
class java.io.IOException
class java.lang.ArrayIndexOutOfBoundsException路人甲正在吃汉堡包,正在喝可乐
排泄物
*/

范例

例1
//对于任意一个对象,都可以吧对象的所有字段名和值,保存到文件中去
//Test.java
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;public class Test {public static void main(String[] args) throws IOException, IllegalAccessException {Student s=new Student("张三",18);Teacher t=new Teacher("李四",19999.0,3,11);//saveFile(t);//saveFIle(s)}public static void saveFile(Object obj) throws IOException, IllegalAccessException {BufferedWriter bw=new BufferedWriter(new FileWriter("a.txt"));Class clazz = obj.getClass();Field[] fields = clazz.getDeclaredFields();for (Field field:fields){field.setAccessible(true);String name = field.getName();Object value = field.get(obj);bw.write(name+"="+value);bw.newLine();}bw.close();}
}//Student.java
public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}
}
//Teacher.java
public class Teacher {private String name;private double salary;private int id;private int age;public Teacher() {}public Teacher(String name, double salary, int id, int age) {this.name = name;this.salary = salary;this.id = id;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return salary*/public double getSalary() {return salary;}/*** 设置* @param salary*/public void setSalary(double salary) {this.salary = salary;}/*** 获取* @return id*/public int getId() {return id;}/*** 设置* @param id*/public void setId(int id) {this.id = id;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Teacher{name = " + name + ", salary = " + salary + ", id = " + id + ", age = " + age + "}";}
}
/*
若是执行saveFile(t)
a.txt内容为
name=李四
salary=19999.0
id=3
age=11*/
/*
若是执行saveFile(s)
a.txt内容为
name=张三
age=18*/
例2
//反射可以跟配置文件结合的方式,动态的创建对象,并调用方法
/*properties.properties
classname=reflect.Teacher
method=teach
*/
//Student.java
public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}public void study(){System.out.println("学习");}
}
//Teacher.java
public class Teacher {private String name;private double salary;private int id;private int age;public Teacher() {}public Teacher(String name, double salary, int id, int age) {this.name = name;this.salary = salary;this.id = id;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return salary*/public double getSalary() {return salary;}/*** 设置* @param salary*/public void setSalary(double salary) {this.salary = salary;}/*** 获取* @return id*/public int getId() {return id;}/*** 设置* @param id*/public void setId(int id) {this.id = id;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Teacher{name = " + name + ", salary = " + salary + ", id = " + id + ", age = " + age + "}";}public void teach(){System.out.println("教学");}
}
//Test.java
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;public class Test {public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {Properties pro=new Properties();FileInputStream fis = new FileInputStream("properties.properties");pro.load(fis);fis.close();String name=(String) pro.get("classname");String method=(String)pro.get("method");Class clazz=Class.forName(name);Constructor constructor = clazz.getDeclaredConstructor();Object o = constructor.newInstance();System.out.println(o);Method method1 = clazz.getDeclaredMethod(method);method1.setAccessible(true);method1.invoke(o);}
}
/*
Teacher{name = null, salary = 0.0, id = 0, age = 0}
教学
*/

动态代理

代理可以无侵入式(不改变原有代码)的给对象增强其他功能。

对象若嫌身上干的事太多,可通过代理转移部分职责。

对象若有方法要被代理,代理则一定要有对应的方法。

调用者调用对象的方法时,是由调用者先调用代理的方法,再由代理调用对象的方法。

代理长什么样:代理里面是对象要被代理的方法。

java通过接口保证代理的样子,后面的对象和代理需要实现同一个接口,接口中就是被代理的所有方法。

Proxy

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

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

参数一:用于指定用哪个类加载器,去加载生成的代理类

参数二:指定接口,这些接口用于指定生成的代理长什么样,也就是有哪些方法

参数三:用来指定生成的代理对象要干什么事情

范例

//Cinema.java
public class Cinema implements CinemaExtend{private String name;public Cinema() {}@Overridepublic String watchMovie(){System.out.println("进入"+name+"电影院");return "看电影";}@Overridepublic void eatPopcorn(String audience){System.out.println(audience+"吃爆米花");}public Cinema(String name) {this.name = name;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}public String toString() {return "Cinema{name = " + name + "}";}
}
//CinemaExtend.java
public interface CinemaExtend {public abstract String watchMovie();public abstract void eatPopcorn(String audience);
}
//ProxyUtil.java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class ProxyUtil {public static CinemaExtend createProxy(Cinema cinema){CinemaExtend cinemaExtend=(CinemaExtend)Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),new Class[]{CinemaExtend.class}, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if("watchMovie".equals(method.getName())){System.out.println("买电影票");}else if("eatPopcorn".equals(method.getName())){System.out.println("买爆米花");}return method.invoke(cinema,args);}});return cinemaExtend;}
}
//Test.java
public class Test {public static void main(String[] args) {Cinema cinema=new Cinema("万达");CinemaExtend ce=ProxyUtil.createProxy(cinema);ce.eatPopcorn("路人甲");System.out.println();System.out.println(ce.watchMovie());}
}
/*
买爆米花
路人甲吃爆米花买电影票
进入万达电影院
看电影
*/

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

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

相关文章

MySQL全表扫描:性能杀手的隐患与优化策略

MySQL全表扫描&#xff1a;性能杀手的隐患与优化策略 MySQL数据库作为常用的关系型数据库管理系统之一&#xff0c;全表扫描问题一直困扰着开发者。本文将深入剖析MySQL全表扫描的原理、其对性能的严重影响&#xff0c;同时提供一系列优化策略&#xff0c;助您高效应对MySQL性能…

【NodeJS】fs 模块 (2)

流式文件写入 & 读取 流式文件写入 / 读取适合操作大文件 流式写入 ① 创建可写流&#xff1a;fs.createWriteStream(path[, options]) path&#xff1a;文件路径options&#xff1a;配置对象 flags&#xff1a;文件系统标志&#xff0c;默认值为 wencoding&#xff1a;…

Android battery saver 简单记录

目录 一. battery saver模式的policy (1) DEFAULT_FULL_POLICY 对应的配置和解释: (2) OFF_POLICY 对应的配置也就说不使用policy (3) 获取省电模式下的policy: 二. 对各个参数代码讲解 (1) adjustBrightnessFactor (2) enableAdjustBrightness (3) advertiseIsEnabled…

ctfshow——文件包含

文章目录 web 78——php伪协议第一种方法——php://input第二种方法——data://text/plain第三种方法——远程包含&#xff08;http://协议&#xff09; web 78——str_replace过滤字符php第一种方法——远程包含&#xff08;http://协议&#xff09;第二种方法——data://&…

070:vue中provide、inject的使用方法(图文示例)

第070个 查看专栏目录: VUE 本文章目录 示例背景示例效果图示例源代码父组件代码子组件代码孙组件代码 基本使用步骤 示例背景 本教程是介绍如何在vue中使用provide和inject。在 Vue 中&#xff0c;provide 和 inject 是用于实现祖先组件向后代组件传递数据的一种方式。 在这个…

oracle 触发器事前触发和事后触发区别

Oracle触发器的事前触发和事后触发主要在触发的时机和触发器内部的操作上有所区别。 触发时机&#xff1a;事前触发器是在触发事件发生之前运行&#xff0c;而事后触发器则在触发事件发生之后运行。 获取的数据&#xff1a;事前触发器通常可以获取到事件发生前和新的字段值。O…

Docker存储空间清理

不知不觉服务器存储空间被Docker掏空了… 查看Docker空间占用情况 使用docker system df命令&#xff0c;可以加 -v 查看详情 清理Docker不需要的内容 使用docker system prune -a命令清理Docker 所有停止的容器所有没有被使用的networks所有没容器的镜像所有build cache …

公共用例库计划--个人版(六)典型Bug页面设计与开发

1、任务概述 本次计划的核心任务是开发一个&#xff0c;个人版的公共用例库&#xff0c;旨在将各系统和各类测试场景下的通用、基础以及关键功能的测试用例进行系统性地归纳整理&#xff0c;并以提高用例的复用率为目标&#xff0c;力求最大限度地减少重复劳动&#xff0c;提升…

图论练习4

内容&#xff1a;染色划分&#xff0c;带权并查集&#xff0c;扩展并查集 Arpa’s overnight party and Mehrdad’s silent entering 题目链接 题目大意 个点围成一圈&#xff0c;分为对&#xff0c;对内两点不同染色同时&#xff0c;相邻3个点之间必须有两个点不同染色问构…

Elasticsearch:入门

1. 介绍Elasticsearch 1.1 什么是Elasticsearch Elasticsearch是一款基于开源的分布式搜索和分析引擎&#xff0c;构建在Apache Lucene之上。它旨在提供一个强大且灵活的工具&#xff0c;使用户能够以高效、实时的方式存储、检索和分析大量数据。 1.2 Elasticsearch的主要特…

自动化测试报告生成【Allure】

之前尝试使用过testNG自带的测试报告、优化过reportNG的测试报告&#xff0c;对这两个报告都不能满意。后经查找资料&#xff0c;发现有个神器&#xff1a; Allure&#xff08;已经有allure2了&#xff0c;笔者使用的就是allure2&#xff09;&#xff0c;生成的测试报告与上述…

异或加密原理及简单应用(C语言版)

加密原理&#xff1a; 异或加密是一种基于异或运算的简单加密算法。在二进制运算中&#xff0c;异或&#xff08;XOR&#xff09;的规则是&#xff1a; 0 XOR 0 00 XOR 1 11 XOR 0 11 XOR 1 0 这意味着如果两个比特相同&#xff0c;则结果为0&#xff0c;否则结果为1。异…

八. 实战:CUDA-BEVFusion部署分析-学习spconv的优化方案(Implicit GEMM conv)

目录 前言0. 简述1. 什么是Implicit GEMM Conv2. Explicit GEMM Conv3. Implicit GEMM Conv4. Implicit GEMM Conv优化5. spconv和Implicit GEMM Conv总结下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0…

Python 中的 __doc__ 属性是用来做什么的?Python 中的 logging 模块是用来做什么的?如何配置日志记录?

Python 中的 doc 属性是用来做什么的&#xff1f; doc 是 Python 中用于存储文档字符串&#xff08;docstring&#xff09;的特殊属性。文档字符串是与模块、类、函数或方法相关联的字符串&#xff0c;用于提供对其功能和使用的简要描述。 主要用途&#xff1a; 文档和注释&a…

WiFi 6 和WiFi 6e 的核心要点

目录 WiFi 6 是什么&#xff1f; WiFi 6/6e 的主要feature功能&#xff1a; 80Mhz and 160Mhz channel 1K QAM WiFi6 支持2.4G band OFDMA&#xff1a;Orthogonal frequency division multiple access OFDMA先把频段分为&#xff1a;Resource Units (RUs) Subcarriers …

使用 Visual Studio Code 在远程计算机上调试 PostgreSQL

使用 Visual Studio Code 在远程计算机上调试 PostgreSQL 1. 概述 PostgreSQL 是一个功能强大的开源关系数据库管理系统&#xff0c;适用于各种应用程序。在开发过程中&#xff0c;调试 PostgreSQL 对于识别和解决问题至关重要。在本博客中&#xff0c;我们将手把手教你使用客…

创建自己的Hexo博客

目录 一、Github新建仓库二、支持环境安装Git安装Node.js安装Hexo安装 三、博客本地运行本地hexo文件初始化本地启动Hexo服务 四、博客与Github绑定建立SSH密钥&#xff0c;并将公钥配置到github配置Hexo与Github的联系检查github链接访问hexo生成的博客 一、Github新建仓库 登…

Windows SDK(四)鼠标和键盘消息处理

鼠标基础知识 鼠标一般分为三种状态&#xff0c;三个按钮 三种状态&#xff1a;单击&#xff0c;双击&#xff0c;拖动 三个按钮&#xff1a;左键&#xff08;LBUTTON&#xff09;&#xff0c;右键&#xff08;RBUTTON&#xff09;&#xff0c;中键&#xff08;MBUTTON&…

【计算机视觉】目标检测 |滑动窗口算法、YOLO、RCNN系列算法

一、概述 首先通过前面对计算机视觉领域中的卷积神经网络进行了解和学习&#xff0c;我们知道&#xff0c;可以通过卷积神经网络对图像进行分类。 如果还想继续深入&#xff0c;会涉及到目标定位(object location)的问题。在图像分类的基础上(Image classification)的基础上…

JAVA中的多态参数

1.方法定义的参数类型为父类类型&#xff0c;实参类型允许为子类类型 public class Ploy_parameter {public static void main(String[] args) {Manage jack new Manage("jack",12000,3000);Staff tom new Staff("tom",10000);Ploy_parameter ploy_para…