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 反射 的详细总结的更多相关文章

  1. java反射使用详细例子

    1. 概念 反射,一种计算机处理方式.是程序可以访问.检测和修改它本身状态或行为的一种能力. 2. 反射机制的作用 通过反机制访问java类的属性,方法,构造方法等: 3.反射机制中的类 (1) ja ...

  2. 初识Java反射

    要详细的了解Java反射,就得要了解Java的类加载以及何为运行时动态加载等等概念.本文抛开其余概念,简单介绍Java反射,详细介绍会在以后有一个系统而全面的认识过后展开. 反射是Java被视为动态语 ...

  3. 面试官:如何在Integer类型的ArrayList中同时添加String、Character、Boolean等类型的数据? | Java反射高级应用

    原文链接:原文来自公众号:C you again,欢迎关注! 1.问题描述     "如何在Integer类型的ArrayList中同时添加String.Character.Boolean等 ...

  4. Java反射详细介绍

    反射 目录介绍 1.反射概述 1.1 反射概述 1.2 获取class文件对象的三种方式 1.3 反射常用的方法介绍 1.4 反射的定义 1.5 反射的组成 1.6 反射的作用有哪些 2.反射的相关使 ...

  5. 超详细的java反射教程

    看技术博客时,看到关于java反射的博文,写的非常好.猛击下面的地址,开始java反射之旅 中文翻译地址:http://ifeve.com/java-reflection/ 英文原版地址:http:/ ...

  6. JAVA反射概念及使用详解(超详细)

    JAVA反射概念及使用详解 一.什么是反射? 反射:框架设计的灵魂 框架:半成品软件.可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 ​ 好处: ​ ...

  7. java反射和动态代理实现与原理详细分析

    关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式    代理模式是常用的java设计模式, ...

  8. Java 反射练习

    已同步更新至个人blog:http://dxjia.cn/2015/08/java-reflect/ 引用baidubaike上对JAVA反射的说明,如下:JAVA反射机制是在运行状态中,对于任意一个 ...

  9. Java反射机制的学习

    Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...

随机推荐

  1. Tomcat简单介绍

    1.目录结构 在conf文件夹中修改了配置之后一定要重启Tomcat

  2. Mysql资料 慢查询

    目录 一.简介 二.查询 三.开启 永久配置 临时配置 四.测试 一.简介 MySQL的慢查询,全名是慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阀值的语句. 具体环 ...

  3. 多个工作簿拆分(Excel代码集团)

    一个文件夹里有N个工作簿,每个工作簿中包括N个工作表,将各个工作表拆分成工作簿,命名为每个工作簿里第一个工作表的A列和B列. 工作簿.工作表数量不定,表内内容不限,拆分后保存于当前文件夹下的" ...

  4. PowerDotNet平台化软件架构设计与实现系列(07):数据同步平台

    上文介绍定时任务调度平台的时候提到,定时任务调度平台的类模式一般用于处理耗时较长的任务.但是根据经验,有些耗时较长的任务,可以通过简化业务逻辑.分页.批量多次处理,改造为耗时较小的适合使用RESTfu ...

  5. SpringMVC编程:初始化项目部署后,主页404代码问题解决

    SpringMVC 主页404问题 初始化项目后,Tomcat服务器显示404报错问题! 问题解决的原因是:项目依赖的jar包没有随着项目一块打包部署在Tomcat服务器上面,即缺少项目lib依赖. ...

  6. SP8374 PARKET1 - PARKET 题解

    Content 有一个 \(l\times w\) 大小的网格,其四周均被染成了红色,其余部分是棕色,已知红色网格与棕色网格的数量,求 \(l\) 与 \(w\) 的值. Solution 接下来给各 ...

  7. 点击DIV触发其他元素的点击事件(案例:点击type="radio" 的input 标签外层DIV,触发内部单选点击选中事件)

    方法一: 直接用找到对应dom元素调用.click()方法 $('.user_content').click(function(){ $(this).children()[0].click(); // ...

  8. Apache Shiro使用官方自带的生成AES密钥

    package test; import org.apache.shiro.codec.Base64; import javax.crypto.KeyGenerator; import javax.c ...

  9. 使用.NET 6开发TodoList应用(7)——使用AutoMapper实现GET请求

    系列导航 使用.NET 6开发TodoList应用文章索引 需求 需求很简单:实现GET请求获取业务数据.在这个阶段我们经常使用的类库是AutoMapper. 目标 合理组织并使用AutoMapper ...

  10. sql改写优化:简单规则重组实现

    我们知道sql执行是一个复杂的过程,从sql到逻辑计划,到物理计划,规则重组,优化,执行引擎,都是很复杂的.尤其是优化一节,更是内容繁多.那么,是否我们本篇要来讨论这个问题呢?答案是否定的,我们只特定 ...