java EE开发之Servlet第十课:反射基础二

Java EE工程实战:从类加载隔离到JTA事务的生产级避坑指南 Java EE不是Java语法的延伸,而是运行在Servlet容器中的企业级规范体系。它通过类加载隔离保障模块独立性,依托生命周期托管实现资源自动回收,并借助JNDI上下文绑定统一管理数据源等外部依赖。其技术价值在于支撑高并发、可伸缩、可维护的Web服务,典型应用场景包括电商订单系统、金融支付网关和SaaS多租户平台。深入理解ClassLoader机制、Servlet线程模型与JTA分布式事务原理,是跨越‘能写代码’到‘能扛流量’的关键断层。本文聚焦真实项目中高频出现的ClassNotFoundExcept 阅读详情

##一.反射类中的属性
在Java中一切皆对象,那么类中任何一个属性都可以看做一个对象,一 个属性对应一个Field对象

####1.先建一个普通的类,写上不同修饰类型的属性

public class Student {
    public String name;
    protected int age;
    String sex;
    private double money;
    public static String phone;
    public static final String email = "xiaoma@qq.com";
    public Date brithday;
    
    public Student() {
        this.name = "tom";
        System.out.println("无参构造方法调用...");
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Student(String name) {
        this.name = name;
        System.out.println("一参构造方法调用...");
    }
    private Student(double money) {
        this.money = money;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
    public double getMoney() {
        return money;
    }
    public void setMoney(double money) {
        this.money = money;
    }
    public static String getPhone() {
        return phone;
    }
    public static void setPhone(String phone) {
        Student.phone = phone;
    }
    public Date getBrithday() {
        return brithday;
    }
    public void setBrithday(Date brithday) {
        this.brithday = brithday;
    }
    public static String getEmail() {
        return email;
    }
    private void sleep() {
        System.out.println("睡啊睡...");
    }
    public void a(int a, int b) {

    }
}

####2,反射加载类并实例化

Class c = Class.forName("com.accp.entity.Student");
Student stu = (Student)c.newInstance();
####3,获取指定名称的公有属性

Field f1 = c.getField("name");
System.out.println(f1);

stu.name = "james";
/*通过反射的方式,给属性赋值*/
f1.set(stu, "james");
/*  通过属性对象,调用get()方法,参数是stu对象
    通过属性对象,调用get()方法,参数是stu对象*/
System.out.println(f1.get(stu));

####4,获取公有(静态)属性


Field ff = c.getField("phone");

stu.name = "138888";
ff.set(stu, "138888");
/*反射获取属性值*/
System.out.println(ff.get(stu));


5,获取指定名称的非公有属性

Field f2 = c.getDeclaredField("money");
/*解锁*/
f2.setAccessible(true);
f2.set(stu, 8888.8);//赋值
System.out.println(f2.get(stu));//取值


####6,获取指定类的所有公有属性

Field [] fields = c.getFields();
for(Field ff:fields){                        
    System.out.println(ff);
}


####7,获取指定类的所有公有属性


Field [] fields = c.getFields();
System.out.println("访问修饰符\t属性类型\t属性的名字");
for(Field ff:fields){
    /*操作属性对象,获取其中每一部分*/
    /*获取访问修饰符*/
    System.out.println(soEasy(ff.getModifiers())+"\t"+
                    ff.getType().getSimpleName()+"\t"+
                    ff.getName());
}
/*自定义将返回的访问修饰符int类型转换为String类型    */
public static String soEasy(int modifier){
    return Modifier.toString(modifier);
}

####8,获取所有的属性

Field [] fields = c.getDeclaredFields();
for(Field ff:fields){
    //System.out.println(ff);
    System.out.println(soEasy(ff.getModifiers())+"\t"+
                    ff.getType().getSimpleName()+"\t"+
                    ff.getName());
}


##二.反射类中的方法

在Java中一切皆对象,那么类中任何一个方法都可以看做一个对象,一个方法对应一个Method对象
加载类并初始化

Class c = Class.forName("com.accp.entity.Student");
/*反射创建Student 对象*/
Student stu = (Student)c.newInstance();


1,获了指定名称的公有方法


Method m1 =  c.getMethod("setName", String.class);
m1.invoke(stu, "小牛");//调用setName()方法,其实就是赋值

Method m2 = c.getMethod("getName");
System.out.println(m2.invoke(stu));//调用m2:getName()方法


2,获取指定名称的非公有方法


Method m3 =  c.getDeclaredMethod("sleep");
m3.setAccessible(true);//解锁
m3.invoke(stu);


3,获取全部的公有方法(包括父亲的);


Method [] ms1 = c.getMethods();
for(Method mm:ms1){
    //System.out.println(mm);                   
    System.out.println(soEasy(mm.getModifiers())+"\t"+
              mm.getReturnType().getSimpleName()+"\t"+
              parse(mm.getParameterTypes()));
}

4,获取自己声明方法(公有、私有),就没有获取父亲的方法


Method [] ms1 = c.getMethods();
for(Method mm:ms1){
    //System.out.println(mm);                   
    System.out.println(soEasy(mm.getModifiers())+"\t"+
              mm.getReturnType().getSimpleName()+"\t"+
              parse(mm.getParameterTypes()));
}
/*自定义实现将Class类型的参数数组转换成String类型*/
public static String parse(Class [] cs){
    StringBuffer sb = new StringBuffer();
    sb.append("(");
    for(int i=0;i<cs.length;i++){
        //获取class对象对应的名字,如:String.class-->String
        sb.append(cs[i].getSimpleName());
        //多个参数中间加一个逗号
        //条件是最后一个参数后面不加逗号
        if(i<cs.length-1){
            sb.append(",");
        }
    }
    sb.append(")");
    return sb.toString();
}


##三,反射类中的构造方法

所有的java文件都会编译成一个class文件,与Clas类型的对象相对应在这个Class类型的对象中,包含了这个java类的属性、方法、构造方法等所有的东西。通过Class类型的对象,获取其构造方法(Constructor):可以通过构造来new出对象.


1,获取反射类无参数构造方法


/*通过Student模板对象,创建出一个实例。
  就是去动态的调用其无参构造方法*/

Class c =  Class.forName("com.accp.entity.Student");
Student stu1 = (Student)c.newInstance();
System.out.println(stu1.getName());

Constructor ct1 =  c.getConstructor();
Student stu1 =  (Student)ct1.newInstance();
System.out.println(stu1.getName());

2,获取反射类一参数的构造方法


Constructor ct2 = c.getConstructor(String.class);
Student stu2 = (Student)ct2.newInstance("jack");
System.out.println(stu2.getName());

3,获取反射类两参数的构造方法

Constructor ct3 = c.getConstructor(String.class,int.class);
Student stu3 = (Student)ct3.newInstance("marry",23);
System.out.println(stu3.getName());
System.out.println(stu3.getAge());

注意:以上的获取构造方法的前提是公有的

4,获取非公有的构造方法时,需要获取是自己声明的。


Constructor ct4 = c.getDeclaredConstructor(double.class);
//授权(解锁)
ct4.setAccessible(true);//默认是为false
Student stu4 = (Student)ct4.newInstance(2345.6);
System.out.println(stu4.getMoney());

5,获取所有的公有的构造方法的对象


Constructor [] cts1 = c.getConstructors();
for(Constructor cc:cts1){
    System.out.println(cc);
}        
System.out.println("==========================");

6,获取所有的构造方法的对象(包括私有的)


Constructor [] cts2 = c.getDeclaredConstructors();
for(Constructor cc:cts2){
    System.out.println(cc);
}


补充: java中的可变参数

定义包含可变参数的方法

public static void test(int ... a){
    int sum = 0;
    for(int i=0;i<a.length;i++){
        sum += a[i];
    }
    System.out.println(sum);
}


测试


public static void main(String[] args){
    test();
    test(1);
    test(1,2);
    test(1,2,3);
}

Jakarta EE课程扩展阅读(二) 本文介绍了JakartaEE中Servlet的核心概念。Servlet与普通Java类在生命周期、运行环境和实例化方式上存在本质区别,其生命周期由容器管理,包含加载、初始化、服务和销毁四个阶段。作为CGI的替代方案,Servlet基于线程而非进程,具有更好的性能和资源共享能力。在JakartaEE技术栈中,Servlet是Web技术的基础,支撑着JSP、JSF等上层框架。从2.x到6.0版本,Servlet规范经历了从XML配置到注解、异步处理等重大演进。现代框架如SpringMVC基于Servlet构建, 阅读详情

相关推荐

Java SE、Java EE、Java ME 三者区别详解,Jakarta EE 改名风波一次讲清

Java 平台是一个庞大而复杂的生态,初学者常被 Java SE、Java EE、Java ME 这组概念困扰。实际上,它们并非同一产品的不同配置,而是面向不同场景的技术集合:Java SE 是核心语言与运行环境的地基,Java EE 在企业级开发中提供 Servlet、JSP、JPA 等规范,Java ME 则面向资源受限的嵌入式设备。理解三者的原理与分工,有助于在 Web 后端、分布式系统或物联网等场景中做出合理的技术选型。同时,Java EE 已由 Eclipse 基金会接管并更名为 Jakarta

weixin_30536861的博客 332

应用:反射在Servlet中的使用

通过反射简化Servlet的逻辑判断

川泽的博客 351

深入理解Java EE:从HelloWorld1入门到实践

Java EE(Java Platform, Enterprise Edition)是Java平台的企业版,它提供了用于开发和运行大型、多层、可伸缩、可靠和安全网络应用程序的API和运行时环境。Java EE基于Java SE(Standard Edition),增加了用于开发企业级应用的服务器端技术。与Java SE相比,Java EE提供了更多适合企业环境的特性和服务,如事务管理、安全性、并发性以及与其他系统的集成。

weixin_31800911的博客 829

javaWeb---Servlet与反射

在HttpServlet的子类中,必须要有空参数的构造方法,即默认的构造方法。 class AServlet extends HttpServlet{ AServlet(){} } 因为当有请求过来时,会根据请求的URL地址,找到相应的url-pattern,然后根据web.xml文件中的映射对应关系,找到处理请求的相应的Servlet,即根据得知相应的servlet类,那么怎么获取

白夜行 2570

Java SE、EE、ME三者区别详解:从规范到应用场景一次讲清

在Java技术体系中,Java SE、Java EE与Java ME是三个绕不开的核心概念。Java SE(标准版)是语言语法、JVM和核心类库的基石,所有Java程序都构建于其上;Java EE(企业版)则是一套面向服务器端复杂业务场景的规范集合,包括Servlet、JPA、JMS等标准,而Spring Boot等框架正是对这些规范的高效实现;Java ME(微缩版)曾用于资源受限的嵌入式设备,如今已逐渐淡出主流。理解三者的层次关系,有助于开发者从底层机制出发,看清Java生态的演进脉络。本文结合版本演变

weixin_29973493的博客 261

datart 二开环境搭建

下载源码, 地址: https://github.com/running-elephant/datart, dev 分支; 解压后使用 idea 打开; 服务端: 3.1 安装依赖, idea会自动安装; 3.2 修改配置文件 /config/application.yml 3.3 创建数据库,并将bin/datart.sql导入到数据库中 3.4 入口: /server/src/main/java/datart/DatartServerApplication.java [外链图片转存失败,源站可能有防.

又是再见? 6133

java通过反射实现HttpServlet

jsp第一次访问服务器时被编译成servlet,然后通过servlet去进行操作。我们通常去继承HttpServlet,然后实现doGet()和doPost()方法

qubeleyZ的博客 1158

ST电机库实战:从状态机到稳健启动流程的深度解析

本文深度解析了ST电机库中状态机的核心作用与稳健启动流程。状态机作为电机控制的“交通指挥官”,通过IDLE、CHARGE_BOOT_CAP、ALIGNMENT等一系列状态的严格跳转,确保了永磁同步电机(PMSM)和直流无刷电机(BLDC)的安全启动与可靠运行,是避免硬件损坏和实现平稳控制的关键。

weixin_29161785的博客 226

利用java反射创建通用Servlet

package web; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; i...

weixin_41436762的博客 532

power bi 演唱会-佐罗

我是业务分析人员,注重使用性,因此,课程不到 30% 的内容就可以解决目前为止我碰到的所有业务问题,剩下的 70% 内容是帮助我提升,优化,升华,精益求精用的,比如第三方工具,比如代码运行速度优化,比如查询逻辑优化等等。系统性上来说,结构明晰,安排上非常有条理,层层递进;《BI 真经》,中有真经二字,略显夸大,而当我第一次证明了这点的时候,我也非常惊讶,这就是我做以下所有事情的一切动力。《BI 真经》综合考量思想性,系统性,本质性,创新性,通用性,技巧性,启发性,对比其他课程有压倒性的显著优势。

v_1090213742的博客 911

【调试记录】GT ip跑aurora 64b66b协议

如果不用,会出现这种情况:自回环测试,数据收发ok.一旦和对方通信,对方接收的就是一堆乱码,因为GT链路发送数据不能是全1或全0,或者长时间的1或0.否则线路容易受到干扰,毕竟线速率10多G,用了加扰和解扰,就可以提高抗干扰能力。64B66B编码,数据输入是64bit,输出是66bit,所以这之间存在着2bit的带宽差,Gearbox 就是用来解决这种差异的,实现方式是:将66bit数据拿出来2bit先存入Gearbox,然后输出64bit.发送同步码或控制数据时,配置成2.2.4 加扰和解扰!

weixin_41246509的博客 1601

利用反射机制将Servlet集成

利用反射机制将Servlet集成 问题引出 在进行 JavaWeb 开发时,有时我们需要写很多个Servlet来对请求进行处理或转发,整个过程繁琐而且还有很多重复的部分。此时我们可以使用反射将一类操作集成到一个Servlet中。 案例设计 例如,对用户信息的增删改查操作,这一相似而已一类的操作我们都要写好几个Servlet呢?这样未免太占用资源,我们现在设想,编写一个基础类(Bas...

远方水木 897

Vlan的封装模式和端口讲解(Access、Trunk、Hypbrid端口)

Vlan(Virtual Local Area Network)虚拟局域网,将一个物理的LAN在逻辑上划分为多个广播域,在交换机上实现广播域隔离(增强局域网的安全性、限制广播风暴、简化网络管理)Vlan通过将二层数据帧打上Vlan标签(打上Vlan标签也就是封装Vlan),正常情况下,不同Vlan Tag的数据包是无法二层直接互访的,以此来实现广播域的隔离可以理解为一个Vlan对应一个广播域,同一Vlan内的主机可以二层直接通信,不同Vlan间的主机无法二层直接通信。

m0_49864110的博客 5642

Servlet+Tomcat+Idea 搭建java EE项目

servlet+tomcat+jsp+http协议+无框架配置Tomcat环境以及servlet+登录实战案例

Dream_start_722的博客 1323

AutoSAR系列讲解 - 资料下载

学习资料下载汇总

雪云飞星的博客 4万+

基于Simulink的无线充电系统LCC补偿网络建模与控制

本文详细介绍了基于Simulink的无线充电系统LCC补偿网络建模与控制方法。首先分析了无线充电系统面临的核心挑战,提出LCC补偿网络解决方案,阐述了其恒流输出和输入阻抗解耦原理。通过Simulink分步演示了系统建模过程,包括松耦合变压器、LCC+LC补偿网络、功率变换级搭建以及频率跟踪控制实现。仿真结果表明,LCC补偿系统在气隙变化和负载跳变下能保持输出电压稳定(波动±3%),效率达89%。文章还总结了工程实现要点,并探讨了动态充电、多负载系统等扩展应用。该教程为开发高效智能的无线充电系统提供了实用指导

amy_mhd的博客 63

【Java】--什么是 Java EE 和 Java SE

平时安装的 JDK 就是 SE。只做通用基础开发,不包含网页、企业服务相关API。

记录生活 227

华为OD机试真题 新系统 9月27号 【数据中心最佳维护窗口】

华为OD机试真题 新系统【数据中心最佳维护窗口】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【数据中心最佳维护窗口】多语言题解。

qq_45776114的博客 1154

基础Java Web: Servlet + Jsp + MySQL 商城Mall

Mall From ItCast Learning.Basic Web 项目地址:点击跳转 路过可Star Note 概要 这是一个最基础的Java EE Web项目——商城类。 项目内容可能过于浅显,笔者是前段时间接触框架时遇到了一些基础问题,又重新拿起快速梳理的一遍。项目很容易上手,也适合复习基础的Java Web知识。之前上学时也做过类似的项目,那个还是比这个美观漂亮的多的,详见...

fanleehao的博客 2335

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java EE开发之Servlet第九课:反射基础一

反射基础一一.Class对象反射:动态编译、可以更好的发挥java的灵活性以及更好的运用java的多态Class类型:任何一个java程序编译后都会形成一个class类型的文件这个class文件就是把java代码进行编译后能够被计算机所认识的字节码。这个class文件有一个与之对象对应的java类型,Class类型Class类型中可以包括当前的class文件中属性、方法、构造方法等。Class类型又

IT传道士的博客 582

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java Servlet 设计及原理

是Java EE(现Jakarta EE)规范中定义的、运行在服务器端的Java小程序。接收客户端(通常是浏览器)发来的HTTP请求,处理后返回响应。更直白地说,Servlet就是一个“中间人”——它把浏览器发来的表单数据、URL参数从HTTP协议中提取出来,交给Java代码处理(比如查数据库、算价格),然后再把结果(HTML、JSON等)塞回HTTP响应里发回给浏览器。Servlet 是Java后端处理HTTP请求的最基础、最底层的编程模型。

lizhengyu891231的博客 263

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

从Java EE到Jakarta EE,企业版Java的发展历程

眼看他起高楼,眼看他宴宾客,眼看他楼塌了

架构师:通透,才能写出好代码! 5375

Tomcat版本差异解析:从Java EE到Jakarta EE的演进

Servlet容器作为Java Web应用的核心运行环境,其规范演进直接影响着企业级应用的开发与部署。从Java EE到Jakarta EE的命名空间迁移,不仅是包路径的变化,更代表着技术生态的演进方向。Tomcat作为最流行的开源Servlet容器,其9、10、11三个版本分别对应不同的规范支持,涉及Servlet、JSP、WebSocket等核心组件的重大更新。理解这些差异对于系统升级、性能优化以及新技术采用至关重要,特别是在处理高并发场景、微服务架构时,正确选择Tomcat版本能显著提升系统吞吐量和响

weixin_32308101的博客 112

java反射及其相关应用

本篇从java的反射概念引出,首先介绍反射的java概念及其相关api,并提供相关案例代码来具体应用。 按照惯例,源代码已上传: 下面开始具体的演示 一,首先是对java中反射机制概念的理解。   java的反射机制其实就是java可以在运行时 二,由反射机制结合servlet的概念,抽取baseServlet。 三,代理模式的介绍及通过反射实现java动态代理。 ...

qq_35041206的博客 307
上一篇: 软件测试工程师怎样快速熟悉项目业务
下一篇: 【无标题】
Meryoufdd
博客等级 码龄5年 13粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值