javaweb-codereview 学习记录-1

Servlet是在Java Web容器上运行的小程序,通常我们用Servlet来处理一些较为复杂的服务器端的业务逻辑。值得注意的是在Servlet3.0之后(Tomcat7+)可以使用注解方式配置Servlet了。

Servlet3.0之前的版本都需要在web.xml中配置,Servlet两对标签,由<servlet><servlet-mapping>组成,Spring MVC框架就是基于Servlet技术实现的。

自己的理解:

servlet实际上就是服务后端逻辑的一段代码,配置servlet的过程实际上就是定义处理类与对应url的映射关系,而filter也是处理http请求的,只不过在servlet处理之前可以做一些过滤检测的操作。当然这种配置方式可以配置在文件中,也可以在代码中以@符号来定义注解,效果一样

spring : 

struts2:

 Struts2主要的开发模式是基于xml配置,在struts.xml中配置Action地址和对应的处理类。

Java反射获取类方法有两种方式:

getMethod(xxx),getMethods()
getDeclaredMethod(xxx)、getDeclaredMethods()。

区别在于getMethod会返回当前类和父类的所有public方法,而getDeclaredMethod返回的是当前的所有方法

Java反射获取类成员变量有两种方式:

getField(xxx)、getFields()
getDeclaredField(xxx)、getDeclaredFields()

 java反射来调用类和类成员方法,在jdk7中MethodHandle可以非常方便的访问和调用类方法:

例子:

import  java.io.InputStream;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import  java.lang.invoke.MethodType;
import java.lang.reflect.Method;
import java.util.Scanner;

public class methodhandler {
    public static void  main(String[] args){
        try {
            String str = "calc.exe";
            Class runtimeClass = Runtime.class;
            MethodHandles.Lookup lookup = MethodHandles.lookup();
            //Runtime rt = Runtime.getRuntime();

            MethodHandle methodHandle = lookup.findStatic(runtimeClass,"getRuntime", MethodType.methodType(runtimeClass));
            //get Runtime.exec
            MethodHandle execMethod = lookup.findVirtual(runtimeClass,"exec",MethodType.methodType(Process.class,new Class[]{String.class} ));

            MethodHandle input = lookup.findVirtual(Process.class,"getInputStream",MethodType.methodType(InputStream.class));
            InputStream in = (InputStream)input.invoke(execMethod.invoke(methodHandle.invoke(),str));


        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }


    }
}

上面这段代码实际上我们只要拿到MethodHandles.lookup 类的对象即可来调用任意类中的方法,这里当然还要注意要调用的方法的返回值的类型也就是MethodType.methodType()中需要指定的目标方法的类型,那么第二个参数肯定就是目标函数的入口参数的类型了,和反射调用传值貌似差不多,获取方法的时候都是传入口参数的类型

 

posted @ 2019-12-25 00:13  tr1ple  阅读(509)  评论(0编辑  收藏  举报