1.java反射
jvm中使用Class对象描述类信息,每一个具体的对象都可以获取对应的Class对象信息。每一个类的信息都会保存着类名.class文件中,jvm在加载该文件后会生成一个Class对象,通过这个Class对象可以直接创建一个对象,也可查看类声明的属性、方法、修饰符号、继承的类和实现的接口信息等等。
可通过以下方式获取class对象
Class bclass = boolean.class;
String string = new String();
Class sClass = string.getClass();
Object o = mapClass.newInstance();//通过class对象创建描述的类对象实例
Map<String,String> map = new HashMap();
Class mapClass = map.getClass();
System.out.println(mapClass.getCanonicalName()); //class对象信息的全路径
System.out.println(Modifier.toString(mapClass.getModifiers())); //class对象的修饰符
TypeVariable[] typeParameters = mapClass.getTypeParameters(); //class对象泛型信息
Type[] genericInterfaces = mapClass.getGenericInterfaces(); //class对象实现的接口
mapClass.getAnnotations(); //class对象的注解
Field age = studentClass.getDeclaredField("age"); //通过指定名称获取成员
Field[] declaredFields = studentClass.getDeclaredFields();//获取所有成员,包括private
Method getAgeMethod = studentClass.getDeclaredMethod("getAge"); //通过方法名获取方法对象
Method[] methods = studentClass.getDeclaredMethods(); //获取所有方法,包括private权限的,
Object invoke = getAgeMethod.invoke(student); //studnet.getAge();
Method setAgeMethod = studentClass.getDeclaredMethod("setAge");
setAgeMethod.invoke(student,23);
下面通过例子详细说明:
//创建一个Student类
package com.xiayu.common.entity;
import java.util.Date;
public class Student {
private String loginName;
private String nickName;
private Integer age;
private Date birthday;
public Student(){}
public Student(String loginName,String nickName,Integer age,Date birthday){
this.loginName = loginName;
this.nickName = nickName;
this.birthday = birthday;
this.age = age;
}
public String getLoginName(){
return this.loginName;
}
public String getNickName(){
return this.nickName;
}
public Integer getAge(){
return this.age;
}
public Date getBirthday(){
return this.birthday;
}
}
通过反射获取类对象信息
Logger logger = LoggerFactory.getLogger(ReflectTest.class);
Student student = new Student();
Class studentClass = Class.forName("com.xiayu.common.entity.Student");
Field age = studentClass.getDeclaredField("age"); //通过指定名称获取成员
Field[] declaredFields = studentClass.getDeclaredFields();//获取所有成员,包括private
Method getAgeMethod = studentClass.getDeclaredMethod("getAge"); //通过方法名获取方法对象
Method[] methods = studentClass.getDeclaredMethods(); //获取所有方法,包括private权限的,
Object invoke = getAgeMethod.invoke(student); //studnet.getAge();
Method setAgeMethod = studentClass.getDeclaredMethod("setAge"); //获取setAge方法对象
setAgeMethod.setAccessible(true); //设置可访问private方法
setAgeMethod.invoke(student,23);//==student.setAge(23)
2.springmvc @RequestMapping实现demo
定义@RequestMap注解
package com.xiayu.common.controller;
import java.lang.annotation.*;
@Documented //使用javadoc可以自动生成文档信息
@Target({ElementType.METHOD}) //描述该注解应用于什么地方,如方法上、类上、成员变量上、方法参数上等等
@Retention(RetentionPolicy.RUNTIME)//定义注解的生命周期RetentionPolicy.RUNTIME .CLASS .SOURCE分别对应运行时 字节码 源码
public @interface RequestMap {
String name() default "";
String value() default "";
}
定义DispatcherServlet,继承HttpServlet,获取所有请求,依据uri映射对应的处理方法Method
package com.xiayu.common.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
@WebServlet(value = "/*",loadOnStartup = 1) // /*所有的请求都到此Servlet中,loadOnStartup 设置此Servlet优先加载
public class DispatcherServlet extends HttpServlet {
private Logger logger = LoggerFactory.getLogger(this.getClass());
private Map<String,Method> map = new HashMap<>(); //map保存uri和对应的Method
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
String requestURI = request.getRequestURI();//获取请求的url
Method method = map.get(requestURI); //通过requestURI来找到要执行的方法
Class declaringClass = method.getDeclaringClass(); //通过method获取声明该方法的类
Object newInstance = declaringClass.newInstance(); //获取实例
method.invoke(newInstance);//生成的实例,调用该方法,此处可以传入请求的参数
}
@Override
public void init() throws ServletException {
try {
Class userClass = Class.forName("com.xiayu.common.controller.UserServlet");//这里userClass是写死的,可以通过扫描class文件夹获取到所有class文件名,然后再使用Class.forName()进行加载
Method[] declaredMethods = userClass.getDeclaredMethods(); //获取userClass类对象的所有声明方法
for (Method method:declaredMethods){
if (method.isAnnotationPresent(RequestMap.class)){ //如果加了RequestMap的注解
RequestMap requestMap = method.getDeclaredAnnotation(RequestMap.class); //就将该方法加入到Map中,value为key,method为value,此处也可以将Method作为value,也可以将方法类的实例作为value,这样就保证类对象是单例的。
map.put(requestMap.value(),method); //put到map中
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
使用@RequestMap
package com.xiayu.common.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UserServlet {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@RequestMap(name ="user login",value = "/getUserInfo")
public void getUserInfo(){
logger.info("getUserInfo");
}
@RequestMap(name = "change password",value = "/changePassword")
public void changePassword(){
logger.info("changePassword");
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。