J2EE基础之反射

简介: J2EE基础之反射

1.什么是反射

反射是 Java 技术中一个非常重要的特性。反射为 J2EE 中的框架提供了很多灵活性,在构建大型应用程序时非常有用。在 J2EE 中,使用反射技术可以实现很多高级功能,比如动态代理、ORM 框架、AOP 以及一些安全和权限控制等。

2.类类的获取(三种方式)

2.1Class.forName(完整类名)

代码如下:

package com.Kissship;
/**
 * 类类的获取(三种方式)
 * 1.Class.forName
 * 2.类实例.getClass
 * 3.类名.class
 * @author jj
 *
 */
public class Demo1 {
  public static void main(String[] args) throws Exception {
    Student stu = new Student();
    //1.Class.forName
    //java.lang.Class 类类,应用在jdbc数据库链接中
    Class c1 = Class.forName("com.Kissship.Student");
    System.out.println(c1);
  }
}

2.2类名.class

代码如下:

package com.Kissship;
/**
 * 类类的获取(三种方式)
 * 1.Class.forName
 * 2.类实例.getClass
 * 3.类名.class
 * @author jj
 *
 */
public class Demo1 {
  public static void main(String[] args) throws Exception {
    Student stu = new Student();
    //2.类实例.getClass
    //通用增删改
    Class c2 = stu.getClass();
    System.out.println(c2);
  }
}

2.3对象.getClass()

代码如下:

package com.Kissship;
/**
 * 类类的获取(三种方式)
 * 1.Class.forName
 * 2.类实例.getClass
 * 3.类名.class
 * @author jj
 *
 */
public class Demo1 {
  public static void main(String[] args) throws Exception {
    Student stu = new Student();
    //3.类名.class
    //通用查询
    Class c3 = Student.class;
    System.out.println(c3);
  }
}

3.反射实例化

1.getConstructor

2.getDeclaredConstructor

3.newInstance

3.1调用无参构造器反射实例化

方法如下:

package com.Kissship;
/**
 * 反射实例化
 * 所有实体类,添加了有参构造器,一定记得补无参构造器     
 * @author jj
 *
 */
public class Demo2 {
  public static void main(String[] args) throws Exception {
    //一切反射从类类开始
    Student stu = new Student();
//    添加了有参构造器,一定记得补无参构造器  
//    1.调用无参构造器反射实例化
    Class c1 = Class.forName("com.Kissship.Student");
    Student s1 = (Student) c1.newInstance();
    System.out.println(s1);
  }
}

3.2调用有一个参数的构造器反射实例化

方法如下:

package com.Kissship;
import java.lang.reflect.Constructor;
/**
 * 反射实例化
 * 所有实体类,添加了有参构造器,一定记得补无参构造器     
 * @author jj
 *
 */
public class Demo2 {
  public static void main(String[] args) throws Exception {
    //一切反射从类类开始
    Student stu = new Student();
//    添加了有参构造器,一定记得补无参构造器  
//    1.调用无参构造器反射实例化
    Class c1 = Class.forName("com.Kissship.Student");
    Student s1 = (Student) c1.newInstance();
    System.out.println(s1);
//    2.调用有一个参数的构造器反射实例化
    //parameterTypes:代表了参数的类别
    Constructor cr1 = c1.getConstructor(String.class);
    Object s2 = cr1.newInstance("come1");
    System.out.println(s2);
  }
}

3.3调用有两个参数的构造器反射实例化

方法如下:

package com.Kissship;
import java.lang.reflect.Constructor;
/**
 * 反射实例化
 * 所有实体类,添加了有参构造器,一定记得补无参构造器     
 * @author jj
 *
 */
public class Demo2 {
  public static void main(String[] args) throws Exception {
    //一切反射从类类开始
    Student stu = new Student();
//    添加了有参构造器,一定记得补无参构造器  
//    1.调用无参构造器反射实例化
    Class c1 = Class.forName("com.Kissship.Student");
    Student s1 = (Student) c1.newInstance();
    System.out.println(s1);
//    2.调用有一个参数的构造器反射实例化
    //parameterTypes:代表了参数的类别
    Constructor cr1 = c1.getConstructor(String.class);
    Student s2 = (Student) cr1.newInstance("come1");
    System.out.println(s2);
//    3.调用有两个参数的构造器反射实例化
    Constructor cr2 = c1.getConstructor(String.class, String.class);
    Student s3 = (Student) cr2.newInstance("come2","阿努比斯军团");
    System.out.println(s3);
  }
}

3.4调用私有的带有一个参数的有参构造器实例化

方法如下:

package com.Kissship;
import java.lang.reflect.Constructor;
/**
 * 反射实例化
 * 所有实体类,添加了有参构造器,一定记得补无参构造器     
 * @author jj
 *
 */
public class Demo2 {
  public static void main(String[] args) throws Exception {
    //一切反射从类类开始
    Student stu = new Student();
//    添加了有参构造器,一定记得补无参构造器  
//    1.调用无参构造器反射实例化
    Class c1 = Class.forName("com.Kissship.Student");
    Student s1 = (Student) c1.newInstance();
    System.out.println(s1);
//    2.调用有一个参数的构造器反射实例化
    //parameterTypes:代表了参数的类别
    Constructor cr1 = c1.getConstructor(String.class);
    Student s2 = (Student) cr1.newInstance("come1");
    System.out.println(s2);
//    3.调用有两个参数的构造器反射实例化
    Constructor cr2 = c1.getConstructor(String.class, String.class);
    Student s3 = (Student) cr2.newInstance("come2","阿努比斯军团");
    System.out.println(s3);
//    4.调用私有的带有一个参数的有参构造器实例化
    //getConstructor方法只能获取到公有的构造器对象
    Constructor cr3 = c1.getDeclaredConstructor(Integer.class);
    cr3.setAccessible(true);//打开权限
    Student s4 = (Student) cr3.newInstance(18);//私有构造器不能直接反射实例化,没有权限
  }
}

这里需要注意的是在获取私有构造器时要用getDeclaredConstructor方法,另外在反射实例化之前我们需要打开权限才能反射实例化,否则的话就无权反射。

控制台输出结果如下:

4.反射动态方法调用

1.getMethod                                                           2.getDeclaredMethod

4.1反射调用无参方法

方法如下:

package com.Kissship;
import java.lang.reflect.Method;
/**
 * 反射动态方法调用
 * 
 * @author jj
 *
 */
public class Demo3 {
  public static void main(String[] args) throws Exception {
    Class c = Student.class;
    Student stu = (Student) c.newInstance();// 获取方法对象
    // 1.反射调用无参方法,先获取到方法对象
    // name:方法名 parameterTypes:调用这个方法要传的参数类型------.getMethod(name, parameterTypes);
    Method m1 = c.getMethod("hello");// 此处是无参方法,所以parameterTypes处不传
    // obj:类实例 args:参数值----.invoke(obj, args);
    // invoke:方法的返回值
    Object invoke = m1.invoke(stu);// 无参,参数值无需传
    System.out.println(invoke);
  }
}

控制台输出结果如下:

 

4.2反射调用有参方法

方法如下:

package com.Kissship;
import java.lang.reflect.Method;
/**
 * 反射动态方法调用
 * 
 * @author jj
 *
 */
public class Demo3 {
  public static void main(String[] args) throws Exception {
    Class c = Student.class;
    Student stu = (Student) c.newInstance();// 获取方法对象
    // 1.反射调用无参方法,先获取到方法对象
    // name:方法名 parameterTypes:调用这个方法要传的参数类型------.getMethod(name, parameterTypes);
    Method m1 = c.getMethod("hello");// 此处是无参方法,所以parameterTypes处不传
    // obj:类实例 args:参数值----.invoke(obj, args);
    // invoke:方法的返回值
    Object invoke = m1.invoke(stu);// 无参,参数值无需传
    System.out.println(invoke);
    // 2.反射调用有参方法
    Method m2 = c.getMethod("hello", String.class);
    Object invoke2 = m2.invoke(stu, "二西莫夫");
    System.out.println(invoke2);
  }
}

控制台输出结果如下:

 

 

4.3反射调用私有的有参方法

方法如下:

package com.Kissship;
import java.lang.reflect.Method;
/**
 * 反射动态方法调用
 * 
 * @author jj
 *
 */
public class Demo3 {
  public static void main(String[] args) throws Exception {
    Class c = Student.class;
    Student stu = (Student) c.newInstance();// 获取方法对象
    // 1.反射调用无参方法,先获取到方法对象
    // name:方法名 parameterTypes:调用这个方法要传的参数类型------.getMethod(name, parameterTypes);
    Method m1 = c.getMethod("hello");// 此处是无参方法,所以parameterTypes处不传
    // obj:类实例 args:参数值----.invoke(obj, args);
    // invoke:方法的返回值
    Object invoke = m1.invoke(stu);// 无参,参数值无需传
    System.out.println(invoke);
    // 2.反射调用有参方法
    Method m2 = c.getMethod("hello", String.class);
    Object invoke2 = m2.invoke(stu, "二西莫夫");
    System.out.println(invoke2);
    // 3.反射调用私有的有参方法
    Method m3 = c.getDeclaredMethod("add",Integer.class,Integer.class);
    m3.setAccessible(true);//打开权限
    Object invoke3 = m3.invoke(stu, 999,998);
    System.out.println(invoke3);
  }
}

控制台输出结果如下:

 

 

在调用私有的方法时,也需要打开权限才能得到权限。否则控制台输出会报错。

5.反射读写属性

1.getDeclareField                                                          2.getDeclareFields

方法如下:

package com.Kissship;
import java.lang.reflect.Field;
/**
 * 反射读写属性
 * @author jj
 *
 */
public class Demo4 {
  public static void main(String[] args) throws Exception{
    Class clz = Student.class;
    Student stu = new Student("come3","nia婷");
    stu.age = 18;
    //需求: 获取到该学生stu的sid值以及sname值-->获取某一个对象中的所有属性
    System.out.println(stu.getSid());
    System.out.println(stu.getSname());
    System.out.println("**************************");
    Field snameField = clz.getDeclaredField("sname");
    snameField.setAccessible(true);
    snameField.set(stu, "塞班");
    //Field:属性对象
    Field[] fields = clz.getDeclaredFields();
    for (Field f : fields) {
      f.setAccessible(true);
      System.out.println(f.getName()+":"+f.get(stu));
    }
  }
}

控制台输出结果如下:


最后J2EE基础之反射就到这里,祝大家在敲代码的路上一路通畅!

感谢大家的观看 !

 

目录
相关文章
|
供应链 BI
SaaS观察:餐饮SaaS
什么是餐饮SaaS很多人有个误区,即SaaS一定是公司内部角色使用,其实大量的SaaS服务日常消费者也时时刻刻参与,比如消费者去餐厅吃饭经常用到的餐厅订单管理软件。通常来说,SaaS软件定位为企业服务工具,即SaaS本质上为组织提高生产力或者改善生产关系的工具,因此一切为提升组织生产力或改善生产关系的软件服务都可以定义为SaaS服务。企业核心业务基本上可以概括为:人财物产供销存七大要素,分别是人力
1739 0
SaaS观察:餐饮SaaS
|
4月前
|
人工智能 运维 安全
零信任进阶:从识别已知威胁到主动阻止未知威胁
本文阐述零信任从“识别已知威胁”向“主动阻止未知威胁”的关键跃迁,提出以持续信任评估、动态授权、智能微分段和AI驱动响应为核心的2.0架构,融合身份强校验、行为基线分析与实时阻断技术,并提供可落地的代码示例与部署方案。(239字)
248 0
|
7月前
|
人工智能 自然语言处理 安全
2026年OpenClaw(原Clawdbot)阿里云部署入门指南:超详细喂饭级教程
在AI自动化代理工具爆发的2026年,OpenClaw(原Clawdbot、Moltbot)凭借“自然语言驱动、插件化无限拓展、全场景自动化”的核心特性,成为个人提效与轻量团队协作的首选工具。其核心价值在于无需复杂开发,仅通过简单的自然语言指令,就能调度各类技能(Skills)完成网页自动化、文件处理、代码开发、邮件管理等具象化任务,彻底解放双手、提升工作效率。
4124 9
|
机器学习/深度学习 人工智能 算法
人工智能发展一日千里:生成式人工智能(GAI)认证引领未来新篇章
人工智能(AI)发展迅猛,生成式人工智能(GAI)作为新兴力量,正重塑多行业格局。GAI技术可生成文本、图像等内容,为医疗、教育等提供创新方案。GAI认证成为衡量个人技能与价值的重要标尺,推动AI人才发展。未来,GAI将在技术进步与伦理规范中持续演进,拥抱GAI认证将助力共创AI新时代。
|
存储 Java 编译器
《Java 开发手册》解读:三目运算符为何会导致 NPE?
在三目运算符中,表达式 1 和 2 在涉及算术计算或数据类型转换时,会触发自动拆箱。当其中的操作数为 null 值时,会导致 NPE 。本文将详细剖析 NPE 出现的原因,重新梳理相关知识点,并进一步扩展,帮助大家彻底理解这个问题。
2905 0
《Java 开发手册》解读:三目运算符为何会导致 NPE?
|
存储 测试技术 程序员
【Python】—— NumPy基础及取值操作
【Python】—— NumPy基础及取值操作
400 1
分布式事务Seata【四】事务补偿(TCC)
常见的分布式事务解决方案有 TCC、全局消息、基于可靠消息服务的分布式事务、最大努力通知等
1668 1
分布式事务Seata【四】事务补偿(TCC)
|
消息中间件 SQL JSON
3、数仓之采集工具MaxWell(MaxWell简介、MaxWell原理、MaxWell部署、MaxWell使用)
3、数仓之采集工具MaxWell(MaxWell简介、MaxWell原理、MaxWell部署、MaxWell使用)
|
IDE Java 程序员
一文了解python中pip的使用
一文了解python中pip的使用
793 0