java 反射 的详细总结
1.前言
什么是反射?
引用教科书的解释:
在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
如何通俗理解?
其实说白了,就是将任意一个类对象【原对象】注入一个反射类里,可以对原对象解析,
获取里面的所有属性和方法信息,并可以调用;使用原对象获取对象类型后获取无参构造函数再实例一个无参对象,
那么这个对象就是该原对象的反射对象,反射对象有着与原对象一样的属性和方法,可以动态获取任意对象信息和动态的调用任意对象方法,
如果不做其他增强操作,就相当于反射对象复制了原对象。
由此可见,可以调用原方法的同时做一些其他操作,也就是增强操作,这也就是动态代理的底层原理。
2.操作
使用代码理解【里面有很多注释,足够理解了啊】
(1)文件目录结构
(2)建一个实体类
package com.example.javabaisc.reflect.deme; import java.util.HashMap;
import java.util.UUID; /**
* 实体类
*/
public class Info {
//被保护的属性
private int id;
private String name;
//无参构造函数
public Info(){};
//有参构造函数
public Info(int id ,String name){
this.id = id ;
this.name = name;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} //共有自定义方法
public String dosomething(String str){
System.out.println("我是自定义方法,输入参数是="+str);
return str+"==="+ UUID.randomUUID().toString();
} //私有被保护的自定义方法
private String love(int num){
System.out.println("我是自定义方法,输入参数是="+num);
return num+"==="+ UUID.randomUUID().toString();
}
//公共使用属性
public String publicParam; }
有各种属性和方法
(3)反射类
package com.example.javabaisc.reflect.deme; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier; /**
* 反射类
*/
public class DoReflect { Logger logger = LoggerFactory.getLogger(getClass()); /*
反射方法【类似于复制操作】
*/
public Object copy(Object object) throws Exception {
/**
* 获取传入原对象的类型
*/
// 写法1:【泛型可写可不写】
Class<?> classType = object.getClass();
logger.warn("获取传入原对象的类型:" + classType.getName());
//写法2:
//原对象的文件路径【注意,没有文件java后缀,不建议这样使用,否则需要传入路对象文件路径】
// String infoURL = "com.example.javabaisc.reflect.deme.Info";
// Class<? > classType = Class.forName(infoURL);
//
//写法3:
//原对象的文件路径【不建议这样使用,否则需要传入路对象文件路径】
// String infoURL = "com.example.javabaisc.reflect.deme.Info";
// Class<?> classType = DoReflect.class.getClassLoader().loadClass(infoURL);
//
//看看,方法2和3 是不是很眼熟,就是以前使用原生的jdbc连接数据库放入操作啊,原来jdbc底层是使用了映射。。。
//但是还是方法1简单,而且容易理解
//
//
/**
* 根据原对象类型,获取无参构造函数后实例一个新的对象,这个就是映射对象
*/
//如果newInstance没有参数,则可以不写空的超类数组
Object objectCopy = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
// //上面一句话可以分步写:
// //步骤1:获取无参构造函数对象
// Constructor<?> constructor = classType.getConstructor(new Class[]{});
// logger.warn("无参构造函数对象名字:" + constructor.getName());
// //步骤2:获反射对象
// Object objectCopy = constructor.newInstance(new Object[]{});
logger.warn("反射对象名字:" + objectCopy.toString());
//
/**
* 获取所有方法
*/
Method[] methods = classType.getDeclaredMethods();
logger.warn("===================================================================");
for (Method method : methods) {
/*
获取方法修饰符
*/
String modifier = Modifier.toString(method.getModifiers());
logger.warn("获取方法修饰符:" + modifier);
/*
获取返回参数类型
*/
// [会获取完整的类型路径名,如 java.lang.String]
String returnType = method.getReturnType().getName();
logger.warn("获取返回参数类型,写法1:" + returnType);
// [仅会获取名字,如String]
String returnType2 = method.getReturnType().getSimpleName();
logger.warn("获取返回参数类型,写法2:" + returnType2);
/*
获取方法名字
*/
String methodName = method.getName();
logger.warn("获取方法名字:" + methodName);
//获取所有传入参数类型
Class<?>[] params = method.getParameterTypes();
logger.warn("------------------------------------------------------------");
for (Class<?> param : params) {
/*
获取参数类型名字
*/
//写法1和2都是获取完整的类型路径名,如 java.lang.String
String paramTypeName = param.getName();
String paramTypeName2 = param.getTypeName();
//该写法3仅会获取类型名字,如String
String paramTypeName3 = param.getSimpleName();
logger.warn("获取参数类型名字,写法1:" + paramTypeName);
logger.warn("获取参数类型名字,写法2:" + paramTypeName2);
logger.warn("获取参数类型名字,写法3:" + paramTypeName3);
}
logger.warn("------------------------------------------------------------");
}
logger.warn("==================================================================="); /**
* 获取指定的方法
*/
logger.warn("使用getMethod获取指定的方法,但是仅能获取public修饰的方法");
//参数分别是 方法名字 、参数类型
Method method = classType.getMethod("dosomething", new Class[]{String.class});
// 指定方法的修饰符
String modifier = Modifier.toString(method.getModifiers());
logger.warn("指定方法的修饰符:" + modifier);
String returnTypeName = method.getReturnType().getSimpleName();
logger.warn("指定方法的返回类型:" + returnTypeName);
//指定方法的名子
String methodName = method.getName();
logger.warn("指定方法的名子:" + methodName);
Class<?>[] params = method.getParameterTypes();
for (Class<?> param : params) {
logger.warn("指定方法的参数类型:" + param.getSimpleName());
}
logger.warn("===================================================================");
logger.warn("使用privateMethod获取指定的方法,可以获取被保护的方法");
//参数分别是 方法名字 、参数类型
Method privateMethod = classType.getDeclaredMethod("love", new Class[]{int.class});
// 指定方法的修饰符
String modifier2 = Modifier.toString(privateMethod.getModifiers());
logger.warn("指定方法的修饰符:" + modifier2);
String returnTypeName2 = privateMethod.getReturnType().getSimpleName();
logger.warn("指定方法的返回类型:" + returnTypeName2);
//指定方法的名子
String methodName2 = privateMethod.getName();
logger.warn("指定方法的名子:" + methodName2);
Class<?>[] params2 = privateMethod.getParameterTypes();
for (Class<?> param : params2) {
logger.warn("指定方法的参数类型:" + param.getSimpleName());
} logger.warn("===================================================================");
/**
* 获取所有属性
*/
logger.warn("获取所有属性");
Field[] fields = classType.getDeclaredFields();
logger.warn("------------------------------------------------------------");
for (Field field : fields) {
//属性修饰符
String modifer = Modifier.toString(field.getModifiers());
logger.warn("属性修饰符:" + modifer);
//属性类型
String fieldType = field.getType().getSimpleName();
logger.warn("属性类型:" + fieldType);
//属性名字
String fieldName = field.getName();
logger.warn("字段名字:" + fieldName);
}
logger.warn("------------------------------------------------------------");
logger.warn("===================================================================");
/**
* 获取指定属性
*/
logger.warn("使用getField获取指定属性,但是仅能获取public修饰的属性");
Field field = classType.getField("publicParam");
//属性修饰符
String modifer = Modifier.toString(field.getModifiers());
logger.warn("属性修饰符:" + modifer);
//属性类型
String fieldType = field.getType().getSimpleName();
logger.warn("属性类型:" + fieldType);
//属性名字
String fieldName = field.getName();
logger.warn("字段名字:" + fieldName);
logger.warn("------------------------------------------------------------");
logger.warn("使用getDeclaredField获取指定属性,可以获取被保护的属性");
Field field2 = classType.getDeclaredField("id");
//属性修饰符
String modifer2 = Modifier.toString(field2.getModifiers());
logger.warn("属性修饰符:" + modifer2);
//属性类型
String fieldType2 = field2.getType().getSimpleName();
logger.warn("属性类型:" + fieldType2);
//属性名字
String fieldName2 = field2.getName();
logger.warn("字段名字:" + fieldName2);
logger.warn("===================================================================");
/**
* 调用对象的方法,
* 首先需要获取方法对象,然后通过参数来选择是调用原对象的方法还是反射对象的方法
*/
logger.warn("调用对象的方法");
/*
向原对象 setname 传入name值,然后 getname 获取原对象name值,然后将获取的值使用反射对象的 setname 方传入后,使用反射对象的 getname 获取
*/
//拼接 setname 方法名字
String setMethodName = "set" + ("name".substring(0, 1).toUpperCase()) + ("name".substring(1));
//拼接 getname 方法名字
String getMethodName = "get" + ("name".substring(0, 1).toUpperCase()) + ("name".substring(1));
//获取 setname 方法对象
Method setMethod = classType.getDeclaredMethod(setMethodName, new Class[]{String.class});
//获取 getname 方法对象
Method getMethod = classType.getDeclaredMethod(getMethodName, new Class[]{});
//调用原对象的 setname方法,并赋值
String mname = "你大爷啊啊啊";
setMethod.invoke(object, new Object[]{mname});
//调用原对象的 getname方法 获取name值
Object value = getMethod.invoke(object, new Object[]{});
logger.warn("调用 原对象 的 getname方法 获取name值为:" + value);
//调用反射对象的 setname方法,并赋值
setMethod.invoke(objectCopy, new Object[]{value});
//调用反射对象的 getname方法 获取name值
Object reflectValue = getMethod.invoke(objectCopy, new Object[]{});
logger.warn("调用 反射对象 的 getname方法 获取name值为:" + reflectValue);
logger.warn("==================================================================="); //返回反射对象
return objectCopy; } }
(4)测试类
package com.example.javabaisc.reflect.deme; import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
* 测试类
*/
public class RETest {
Logger log = LoggerFactory.getLogger(getClass()); @Test
public void t() throws Exception { //实例实体类
Info info = new Info();
//实例反射类
DoReflect doReflect = new DoReflect();
//调用反射类的反射方法,将实体类对象注入进去 ,返回这个实体类的反射对象
Info infoReflect = (Info) doReflect.copy(info);
//调用反射对象的方法
String res = infoReflect.dosomething("扫地啦");
log.warn("调用反射对象的方法的结果是:{}",res);
//调用反射对象的getname方法[已经在反射方法了做了赋值操作]
String name = infoReflect.getName();
log.warn("调用反射对象的getname方法的结果是:{}",name); } }
3.测试
运行测试类,控制台打印
16:16:40.811 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取传入原对象的类型:com.example.javabaisc.reflect.deme.Info
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 反射对象名字:com.example.javabaisc.reflect.deme.Info@78a2da20
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ===================================================================
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取方法修饰符:public
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取返回参数类型,写法1:java.lang.String
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取返回参数类型,写法2:String
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取方法名字:getName
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ------------------------------------------------------------
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ------------------------------------------------------------
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取方法修饰符:public
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取返回参数类型,写法1:int
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取返回参数类型,写法2:int
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取方法名字:getId
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ------------------------------------------------------------
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ------------------------------------------------------------
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取方法修饰符:public
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取返回参数类型,写法1:void
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取返回参数类型,写法2:void
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取方法名字:setName
16:16:40.814 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ------------------------------------------------------------
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取参数类型名字,写法1:java.lang.String
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取参数类型名字,写法2:java.lang.String
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取参数类型名字,写法3:String
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ------------------------------------------------------------
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取方法修饰符:public
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取返回参数类型,写法1:java.lang.String
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取返回参数类型,写法2:String
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取方法名字:dosomething
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ------------------------------------------------------------
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取参数类型名字,写法1:java.lang.String
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取参数类型名字,写法2:java.lang.String
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取参数类型名字,写法3:String
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ------------------------------------------------------------
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取方法修饰符:private
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取返回参数类型,写法1:java.lang.String
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取返回参数类型,写法2:String
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取方法名字:love
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ------------------------------------------------------------
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取参数类型名字,写法1:int
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取参数类型名字,写法2:int
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取参数类型名字,写法3:int
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ------------------------------------------------------------
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取方法修饰符:public
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取返回参数类型,写法1:void
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取返回参数类型,写法2:void
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取方法名字:setId
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ------------------------------------------------------------
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取参数类型名字,写法1:int
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取参数类型名字,写法2:int
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取参数类型名字,写法3:int
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ------------------------------------------------------------
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ===================================================================
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 使用getMethod获取指定的方法,但是仅能获取public修饰的方法
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 指定方法的修饰符:public
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 指定方法的返回类型:String
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 指定方法的名子:dosomething
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 指定方法的参数类型:String
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ===================================================================
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 使用privateMethod获取指定的方法,可以获取被保护的方法
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 指定方法的修饰符:private
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 指定方法的返回类型:String
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 指定方法的名子:love
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 指定方法的参数类型:int
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ===================================================================
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 获取所有属性
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ------------------------------------------------------------
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 属性修饰符:private
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 属性类型:int
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 字段名字:id
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 属性修饰符:private
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 属性类型:String
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 字段名字:name
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 属性修饰符:public
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 属性类型:String
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 字段名字:publicParam
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ------------------------------------------------------------
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ===================================================================
16:16:40.815 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 使用getField获取指定属性,但是仅能获取public修饰的属性
16:16:40.816 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 属性修饰符:public
16:16:40.816 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 属性类型:String
16:16:40.816 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 字段名字:publicParam
16:16:40.816 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ------------------------------------------------------------
16:16:40.816 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 使用getDeclaredField获取指定属性,可以获取被保护的属性
16:16:40.816 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 属性修饰符:private
16:16:40.816 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 属性类型:int
16:16:40.816 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 字段名字:id
16:16:40.816 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ===================================================================
16:16:40.816 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 调用对象的方法
16:16:40.816 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 调用 原对象 的 getname方法 获取name值为:你大爷啊啊啊
16:16:40.816 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - 调用 反射对象 的 getname方法 获取name值为:你大爷啊啊啊
16:16:40.816 [main] WARN com.example.javabaisc.reflect.deme.DoReflect - ===================================================================
我是自定义方法,输入参数是=扫地啦
16:16:41.085 [main] WARN com.example.javabaisc.reflect.deme.RETest - 调用反射对象的方法的结果是:扫地啦===fd1cfc80-e653-4661-9f06-77780f363a5d
16:16:41.087 [main] WARN com.example.javabaisc.reflect.deme.RETest - 调用反射对象的getname方法的结果是:你大爷啊啊啊
java 反射 的详细总结的更多相关文章
- java反射使用详细例子
1. 概念 反射,一种计算机处理方式.是程序可以访问.检测和修改它本身状态或行为的一种能力. 2. 反射机制的作用 通过反机制访问java类的属性,方法,构造方法等: 3.反射机制中的类 (1) ja ...
- 初识Java反射
要详细的了解Java反射,就得要了解Java的类加载以及何为运行时动态加载等等概念.本文抛开其余概念,简单介绍Java反射,详细介绍会在以后有一个系统而全面的认识过后展开. 反射是Java被视为动态语 ...
- 面试官:如何在Integer类型的ArrayList中同时添加String、Character、Boolean等类型的数据? | Java反射高级应用
原文链接:原文来自公众号:C you again,欢迎关注! 1.问题描述 "如何在Integer类型的ArrayList中同时添加String.Character.Boolean等 ...
- Java反射详细介绍
反射 目录介绍 1.反射概述 1.1 反射概述 1.2 获取class文件对象的三种方式 1.3 反射常用的方法介绍 1.4 反射的定义 1.5 反射的组成 1.6 反射的作用有哪些 2.反射的相关使 ...
- 超详细的java反射教程
看技术博客时,看到关于java反射的博文,写的非常好.猛击下面的地址,开始java反射之旅 中文翻译地址:http://ifeve.com/java-reflection/ 英文原版地址:http:/ ...
- JAVA反射概念及使用详解(超详细)
JAVA反射概念及使用详解 一.什么是反射? 反射:框架设计的灵魂 框架:半成品软件.可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 好处: ...
- java反射和动态代理实现与原理详细分析
关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式 代理模式是常用的java设计模式, ...
- Java 反射练习
已同步更新至个人blog:http://dxjia.cn/2015/08/java-reflect/ 引用baidubaike上对JAVA反射的说明,如下:JAVA反射机制是在运行状态中,对于任意一个 ...
- Java反射机制的学习
Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...
随机推荐
- 使用 OPC Browser 加载 OPC Server 监测点
1,首先第一步,要连接OPC ,创建好 OPC对象. /// <summary> /// 连接OPC /// </summary> private string OPCIP=1 ...
- Markdown随时记录
Markdown学习 推荐文本编译器 Typora 标题(支持六级) 一级标题:# + 空格 + 内容 二级标题:## + 空格 + 内容 三级标题:### + 空格 + 内容 . . . 字体 粗体 ...
- VUE3 之 template 语法
1. 概述 老话说的好:干一行,爱一行,踏实工作才是真正快乐的源泉. 言归正传,今天继续聊 VUE3 的话题,今天聊聊 template 语法. 闲话不多说,直接上代码. 2. template 语法 ...
- [BUUCTF]PWN——bjdctf_2020_babystack2
bjdctf_2020_babystack2 附件 步骤: 例行检查,64位程序,开启了nx保护 尝试运行一下程序,看看情况 64位ida载入,习惯性的先检索程序里的字符串,发现了bin/sh,双击跟 ...
- 工作簿拆分(Excel代码集团)
一个工作簿中包括N个工作表,将各个工作表拆分成工作簿. 工作表数量不定,表内内容不限,拆分后保存于当前文件夹内. Sub Sample() Dim MySheetsCount As Long For ...
- 打印讲义中的幻灯片编号(O365新功能)
以下听听文档小程序
- 由一次 UPDATE 过慢 SQL 优化而总结出的经验
最近,线上的 ETL 数据归档 SQL 发生了点问题,有一个 UPDATE SQL 跑了两天还没跑出来: update t_order_record set archive_id = '420a7fe ...
- java 编程基础 类加载器
什么是类加载器 类加载器负责将class文件(可能在磁盘上,也可能在网络上)加载到内存中,并为之生成对应的java.lang.Class对象.Java开发中无须过分关心类加载机制,但所有的编程人员都应 ...
- byte数组(byte[])与MultipartFile相互转化
MultipartFile转化为byte数组 byte[] bytes= file.getBytes(); byte数组转化为MultipartFile <dependency> < ...
- UDP&串口调试助手用法(1)
一览 UDP 串口 常用 功能概述 概览 支持UDP通信协议: 广播.单播.组播 支持串口通信 配置了常用的配置,常用的进制转化: 2进制,8进制,10进制,和16进制之间的转换 配置了 计算器,加减 ...