20220420java第二阶段----webserver、反射、注解

webserver

WebServer主类


WebServer是一个Web容器,实现了Tomcat中的基础功能,通过这个项目的学习了解Tomcat的
底层工作逻辑。
Web容器是一个Web服务端程序,主要负责两方面的工作:
1:管理部署在容器中的所有网络应用
2:与客户端(通常就是浏览器)进行TCP通讯,并基于HTTP协议进行应用交互,使得客户端可以
  通过网络远程调用容器下不同网络应用中的内容。
  网络应用(webapp):包含的内容大致有:网页,处理业务的代码,其他资源等。就是俗称的"网站"

与客户端交流的流程分成三步:1:解析请求2:处理请求3:发送响应

每个请求由三部分构成:请求行 消息头 消息正文

每个响应由三部分组成: 状态行,响应头,响应正文

反射

反射是java的动态机制,可以允许我们在程序[运行期间]再确定实例化,调用某个方法,操作某个属性。反射机制大大的提高了代码的灵活度,但是会有更高的系统开销和较慢的运行效率。 因此反射机制不能被过度的使用。

类对象  Class的实例

JVM在加载一个类的class文件时,就会同时创建一个Class的实例,使用该实例记录加载的
类的一切信息(类名,有哪些属性,哪些方法,哪些构造器等)。并且每个被JVM加载的类都有
且只有一个Class的实例与之对应。
反射的第一步就是获取要操作的类的类对象,以便程序在运行期间得知要操作的类的一切信息
然后对其进行响应的操作。

获取一个类的类对象的常见方式:
1:类名.class
例如:
    Class cls = String.class;
    Class cls = int.class;
    注意:基本类型获取类对象只有这一种方式。

2:Class.forName(String className)
例如:
    Class cls = Class.forName("java.lang.String");
    这里传入的类名必须是类的完全限定名,即:包名.类名

3:还可以通过类加载器形式完成

cls.getName(); 获取当前类对象所表示的类的完全限定名

cls.getSimpleName() 仅获取类名(不包含包名)

Method[] getMethods() 获取当前类对象所表示的类中定义的所有公开方法,包含从超类继承下来的方法

java.lang.reflect.Method类,方法对象
该类的每一个实例用于表示某个类中定义的一个方法,通过它可以获取其表示的方法中的
相关信息(方法名,参数个数,参数类型,返回值类型等等,并且还可以调用这个方法)

使用反射机制实例化对象

1获取要实例化的类的类对象
     Class cls = Class.forName("reflect.Person");

2类对象直接提供了可以通过公开的无参构造器实例化的功能
Object obj = cls.newInstance();

使用有参构造器进行实例化

  cls.getConstructor();//不穿任何参数时获取的仍然是无参构造器
        Constructor c = cls.getConstructor(String.class,int.class);
        //new Person("王五",55);
        Object obj = c.newInstance("王五",55);//实例化时要传入构造器要求的实际参数

 使用反射机制调用方法

  //2调用方法
        //2.1通过类对象获取要调用的方法
//        Method method = cls.getMethod("sayHello");//获取的是无参的sayHello方法
        Method method = cls.getMethod(methodName);
        //2.2通过获取的方法对象来调用该方法
//        obj.sayHello()  因为obj指向的是及一个Person对象,因此反射机制可以调用到它的sayHello()
        method.invoke(obj);

调用有参方法

 Method method = cls.getMethod("doSomeThing", String.class);
method.invoke(obj,"玩游戏");//p.doSomeThing("玩游戏");

区别:

getMethod(),getMethods()
它们都是获取Class所表示的类的所有公开方法,包含从超类继承的

getDeclaredMethod(),getDeclaredMethods()
这两个方法获取的都是Class所表示的类中当前类自身定义的方法。包含私有方法

method.setAccessible(true);//强行打开dosome方法的访问权限

main方法上的参数String[] args的作用是

在命令行上使用java命令指定当前类时,可以传递参数进来,此时会被main上的String[] args接收

两个开发中常用的相对路径

//1这里的当前目录表示的是当前ReflectDemo7这个类所在最外层包的上一级目录
File dir = new File(
        ReflectDemo7.class.getClassLoader().getResource(".").toURI()
);

//2这里的当前目录就是当前类所在的目录
File dir = new File(
        ReflectDemo7.class.getResource(".").toURI()
);

 注解

/**
 * 注解
 * 注解在开发中常被我们利用到反射机制中,辅助反射机制做更多灵活的操作
 * 注解在如今JAVA流行的框架中被大量的应用,简化了以前繁琐的配置工作。
 *
 * 注解可以在:
 * 类上,属性上,方法上,构造器上,以及参数上使用
 * 可以通过java内置的注解@Target来说明当前注解可以被应用的位置,对应的值被定义在ElementType上
 * 例如:
 * @Target(ElementType.TYPE)  注解只能被用于类上
 * @Target({ElementType.TYPE,ElementType.METHOD}) 注解只能被用于类上或方法上
 * 当可以用于多个位置时,需要定义成数组的方式包含所有ElementType的值,即"{}"包含
 *
 *
 * @Retention注解,用于标注当前注解的保留级别,有三个选项
 * RetentionPolicy.SOURCE 注解仅保留在源代码中
 * RetentionPolicy.CLASS 注解保留在字节码中,但是反射机制不能调用
 * RetentionPolicy.RUNTIME 注解保留在字节码文件中,并且可以被反射机制所使用
 * 当不指定@Retention时,默认的保留级别为CLASS,因此我们通常都需要明确指出保留级别为RUNTIME
 */
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Royalreairman

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值