J2EE&反射

2023-11-02

什么是反射?

Java语言的一种机制,通过这种机制可以动态的实例化对象,读写属性,调用方法

类类

类类:描述类的类,不是官方定义的语言

  • Class.forName(完整的类名)
  • 类名.class
  • 对象.getClass()
    其中,Class.forName(完整的类名)是三者当中灵活性最强的,作者使用较多
//获取类对象
//Class.forName(完整的类名)
	Class<Student> class01 = (Class<Student>)Class.forName("com.zking.fs.Student");
//类名.class	
	Class class02 =Student.class;
//对象.getClass()		
	Student stu = new Student();
	Class class03 = stu.getClass();
		
	System.out.println(class01);
	System.out.println(class02);
	System.out.println(class03);

反射实例化

获取构造函数的方法
getConstructor
getDeclareadConstr(用于获取私有的构造函数)
newInstance

  • 公有构造函数
//通过class01实例化对象
	Constructor<Student> constructor1 = class01.getConstructor();
	//通过新建一个实例
	Student stu1 = constructor1.newInstance();
	stu1.setSid("4");
	stu1.setSname("fd");
	System.out.println(stu1);
  • 私有构造函数
	Constructor<Student> constructor5 = class01.getDeclaredConstructor(String.class,String.class);
	Student stu6 = constructor5.newInstance("we","fd");
	System.out.println(stu6);

反射动态方法调用

  • getMethod
  • getDeclareadMethod
  • 公有构造函数
//获取方法对象
	Method method = class01.getMethod("hello");
	stu6.setSname("fd");
	//方法对象调用对象
	method.invoke(stu6);
  • 私有构造函数
	Method method3 = class01.getDeclaredMethod("add",Integer.class,Integer.class);
	//因为是私有的构造函数,所以要开放权限
	method3.setAccessible(true);//可操作的
	System.out.println(method3.invoke(stu6, 23,54));

反射读写属性

getField
getDeclaredField

  • 公有构造函数
	Field field = class01.getField("age");
	field.set(stu6, 76);
	System.out.println(stu6);
  • 私有构造函数
	Field field2 = class01.getDeclaredField("sname");
	field2.setAccessible(true);
	field2.set(stu6, "sdf");
	System.out.println(stu6);

源代码

文件:Demo.java

package com.zking.fs;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Demo {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
		Class<Student> class01 = (Class<Student>)Class.forName("com.zking.fs.Student");
		
//		Class class02 =Student.class;
		
//		Student stu = new Student();
//		Class class03 = stu.getClass();
		
//		System.out.println(class01);
//		System.out.println(class02);
//		System.out.println(class03);
		
		Constructor<Student> constructor1 = class01.getConstructor();
		Student stu1 = constructor1.newInstance();
		stu1.setSid("4");
		stu1.setSname("fd");
		System.out.println(stu1);
		
		Constructor<Student> constructor2 = class01.getConstructor(String.class,String.class);
		Student stu2 = constructor2.newInstance("12","er");
		System.out.println(stu2);
		
		Constructor<Student> constructor3 = class01.getConstructor(String.class,String.class,Integer.class);
		Student stu3 = constructor3.newInstance("12","er",34);
		System.out.println(stu3);
		
		Constructor<Student> constructor4 = class01.getConstructor(String.class);
		Student stu4 = constructor4.newInstance("er");
		System.out.println(stu4);
		
		Constructor<Student> constructor5 = class01.getDeclaredConstructor(String.class,String.class);
		Student stu6 = constructor5.newInstance("we","fd");
		System.out.println(stu6);
		
		Method method = class01.getMethod("hello");
		stu6.setSname("fd");
		method.invoke(stu6);
		
		Method method2 = class01.getMethod("hello", String.class);
		method2.invoke(stu6,"dsfd");
		
		Method method02 = class01.getMethod("hello",String.class);
		Object invoke = method02.invoke(stu6, "zengfanyan");
		System.out.println(invoke);
		
		Method method3 = class01.getDeclaredMethod("add",Integer.class,Integer.class);
		method3.setAccessible(true);
		System.out.println(method3.invoke(stu6, 23,54));
		
		Field field = class01.getField("age");
		field.set(stu6, 76);
		System.out.println(stu6);
		
		Field field2 = class01.getDeclaredField("sname");
		field2.setAccessible(true);
		field2.set(stu6, "sdf");
		System.out.println(stu6);
	}
}

文件:Student.java

package com.zking.fs;

public class Student {
	private String sid;

	private String sname;

	public Integer age;

	static {
		System.out.println("加载进jvm中!");
	}

	public Student() {
		super();
		System.out.println("调用无参构造方法创建了一个学生对象");
	}

	public Student(String sid) {
		super();
		this.sid = sid;
		System.out.println("调用带一个参数的构造方法创建了一个学生对象");
	}

	public Student(String sid, String sname) {
		super();
		this.sid = sid;
		this.sname = sname;
		System.out.println("调用带二个参数的构造方法创建了一个学生对象");
	}

	public Student(String sid, String sname, Integer age) {
		super();
		this.sid = sid;
		this.sname = sname;
		this.age = age;
		System.out.println("调用带二个参数的构造方法创建了一个学生对象");
	}

	@SuppressWarnings("unused")
	private Student(Integer age) {
		System.out.println("调用Student类私有的构造方法创建一个学生对象");
		this.age = age;
	}

	public String getSid() {
		return sid;
	}

	public void setSid(String sid) {
		this.sid = sid;
	}

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

	public void hello() {
		System.out.println("1你好!我是" + this.sname);
	}

	public void hello(String name) {
		System.out.println(name + "2你好!我是" + this.sname);
	}

	@SuppressWarnings("unused")
	private Integer add(Integer a, Integer b) {
		return new Integer(a.intValue() + b.intValue());
	}

	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + ", age=" + age + "]";
	}

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

J2EE&反射 的相关文章

  • 将一种类型的对象声明为另一种类型的实例有什么好处? [复制]

    这个问题在这里已经有答案了 可能的重复 Base b2 new Child 是什么意思 表示 https stackoverflow com questions 4447924 what does base b2 new child sig
  • Quarkus 不以编程方式选择 bean

    我试图以编程方式选择 bean 但 quarkus 不会注入 bean 并引发异常 不支持吗 public enum ReportType ONE TWO Qualifier Retention RUNTIME Target METHOD
  • 如何为小程序提供对文件系统写入的访问权限

    我在设置小程序的策略文件时遇到问题 我是第一次这样做 不知道如何在java中设置小程序的策略文件 实际上我想授予小程序在文件系统上写入的权限 为此我必须向小程序授予文件权限 所以我创建了一个名为 java policy 的文件 并将以下代码
  • Kafka Java Consumer 已关闭

    我刚刚开始使用卡夫卡 我面临着消费者的一个小问题 我用Java写了一个消费者 我收到此异常 IllegalStateException 此消费者已关闭 我在以下行中遇到异常 ConsumerRecords
  • 需要正则表达式帮助

    我正在尝试替换两次或多次出现的 br like br br br 标签与两个一起 br br 具有以下模式 Pattern brTagPattern Pattern compile lt s br s s gt s 2 Pattern CA
  • Eclipse CDT Headless 构建在构建完成后挂起

    我正在为我们的嵌入式应用程序实现一个持续集成服务器 该应用程序是使用 GNU ARM 工具链和 GNU ARM ECLIPSE 插件构建的 因此 我需要从服务器上的命令行编译我们的 CDT 项目 我想编译 Debug Release 和 U
  • 如何使用 swagger-codegen-plugin (maven) 生成客户端代码?

    我需要使用 swagger codegen plugin for maven 在 eclipse 中生成服务器存根代码 你能帮忙怎么做吗 以及需要什么配置 在 pom xml 中 我找到了这个答案 您只需要像下面这样更改 pom xml 即
  • 从 Android 访问云存储

    我一直无法找到任何有关如何从 Android 应用程序使用云存储的具体文档 我确实遇到过这个客户端库 https cloud google com storage docs reference libraries然而 Google Clou
  • 如何在 Bean Validation 1.0 中构造 ConstraintViolationException?

    我对 javax validation API 感到困惑 我正在编写一个简单的测试来理解它 Sample sample new Sample Set
  • 多线程——更快的方法?

    我有一堂有吸气剂的课程getInt 和一个二传手setInt 在某个领域 比如说领域 Integer Int 一个类的一个对象 比如说SomeClass The setInt 这里是同步的 getInt isn t 我正在更新的值Int来自
  • 改变 Java 中凯撒移位的方向

    用户可以通过选择 1 向左或 2 向右移动字母来选择向左或向右移动 左边工作正常 右边不行 现在它显示了完全相同的循环 但我已经改变了所有 and 以不同的方式进行标记 最终我总是得到奇怪的字符 如何让程序将字符向相反方向移动 如果用户输入
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • Java:一个函数有多种返回类型...可以使用泛型吗?

    为了简单起见 我有一些程序 如下所示 public String fetchValueAsString String key public DateTime fetchValueAsDateTime String key 我想要类似的东西
  • JPA 将 BigDecimal 作为整数保存在数据库中

    我在数据库中有这个字段 ITEMCOST NUMERIC 13 DEFAULT 0 NOT NULL 在JAVA中 Entity中的字段定义如下 Column name ITEMCOST private BigDecimal itemCos
  • 如何清理 Runtime.exec() 中使用的用户输入?

    我需要通过命令行调用自定义脚本 这些脚本需要很少的参数并在 Linux 机器上调用 当前版本容易出现各种shell注入 如何清理用户给出的参数 参数包括登录名和路径 Unix 或 Windows 路径 用户应该能够输入任何可能的路径 该路径
  • Java 中的微分方程

    我正在尝试用java创建一个简单的SIR流行病模型模拟程序 基本上 SIR 由三个微分方程组定义 S t l t S t I t l t S t g t I t R t g t I t S 易感人群 I 感染人群 R 康复人群 l t c
  • 如何使用注释处理 Hibernate 和 Spring 中的连接查询?

    我正在使用 Spring 和 Hibernate 以及 MySQL 开发应用程序 我是 Hibernate 新手 完成了基本任务 现在我需要在选择查询中应用联接以使用注释从多个表中获取数据 我已经搜索过但仍然没有任何想法 这是我的数据库表和
  • @Embeddable 中的 @GenerateValue

    我已将实体的 id 分离到一个单独的 Embeddable 类中 该实体如下 Entity Table name users public class Users EmbeddedId private Users pk id private
  • 使用 AmazonSNSClient 发送短信时的授权

    aws 官方文档如何发送短信 http docs aws amazon com sns latest dg sms publish to phone html使用 java 中的 aws SDK 非常简单 但是 当发送如底部示例所示的消息时
  • 将数组值导出到 csv 文件 java

    我只需要帮助将数组元素导出到 csv 文件 我不知道我的代码有什么问题 任何帮助将不胜感激 谢谢 for int index 0 index lt cols length index FileWriter fw new FileWriter

随机推荐

  • Maven安装配置教程(Windows版)

    一 Maven下载 maven下载官网地址 Maven Download Apache Maven 一 maven最新版本下载 进入这个页面 进行如图两步操作点击下载 即可下载maven最新版 bin zip文件为Windows版本 二 m
  • Box-Cox转换

    Box Cox变换后的数据 可以使回归模型满足线性 误差独立性 误差方差齐性和误差正态性 同时又不丢失信息 对存在非线性关系的数据 可以使用复杂模型拟合非线性函数来处理非线性问题 但这样的运算更复杂 先采用相对简单的数据转换来尝试将数据关系
  • 安装 Jenkins 保姆级别教程 jdk17 安装插件htmlpublisher

    文章目录 1 下载JDK17 2 下载jenkins 3 安装Jenkins 4 在页面中打开Jenkins 5 切换Jenkins的工作空间 6 安装插件 1 下载JDK17 注意区分 简称 描述 JDK java开发工具包 JRE ja
  • 使用webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

    1 前言 在我们使用 Selenium 进行 UI 自动化测试时 常常会因为浏览器驱动与浏览器版本不匹配 而导致自动化测试无法执行 需要手动去下载对应的驱动版本 并替换原有的驱动 可能还会遇到跨操作系统进行测试的时候 以及浏览器自动升级后
  • 若依框架包名修改器

    链接 https pan baidu com s 15YJCZtm28sJLcEp9EAH6aQ pwd 8n1v 提取码 8n1v
  • 用tensorflow搭建简单的CNN网络

    使用了两种不同的tensorflow API搭建了一个简单的CNN网络 用于识别mnist数据集中的手写数字 输出结果有10个类 数字0 9 网络结构只有简单的两层卷积层 全连接层 输出层 如下如图所示 搭建网络的步骤如下 读取mnist数
  • iOS开发之Xcode的静态分析(Static Code Analysis)与常见问题解决

    iOS开发之Xcode的静态分析 Static Code Analysis 与常见问题解决 一 Xcode Analyze静态分析 Static Code Analysis Static Code Analysis 静态代码分析 用来发现源
  • 【LeetCode-多线程】1116. 打印零与奇偶数

    目录 一 题目 二 解决 1 Semaphore 2 CountDownLatch 3 Thread yield 4 LockSupport 5 Thread yield 6 ReentrantLock Condition 三 参考 一 题
  • JDBC开发步骤总结

    1 加载驱动 搭建环境 I 将Oracle驱动Jar包复制到项目中的自建lib文件夹下 II ojdbc6 jar 右键 gt build path gt add to build path III Class forName oracle
  • 帆软—报表专题

    函数计算格式 if函数判断 连接运算符 concat 正则 设计器函数汇总 count 文本函数 日期时间函数 逻辑switch函数 函数使用位置 https help fanruan com finereport10 0 doc view
  • ipad上linux终端,如何使用iSH在iPad或iPhone上获取Linux Shell

    您是否曾经希望在iPad或iPhone上安装Linux命令行 使用iSH 您可以非常接近实现该目标 iSH Shell是适用于iOS的Linux Shell 它使用x86模拟器在iPad或iPhone上运行Alpine Linux的简化版本
  • uniapp微信小程序外壳内联H5实现支付

    业务场景 用户有现成的微信H5应用 有微信支付 用户想要一个一摸一样的小程序版本 但是又不想高成本去重新开发 所以可以考虑采用小程序的web view组件内联现有的微信H5应用 哇简直不要再偷懒了 简直就是分分钟搞定的事 是不是太简单了 给
  • 网络安全是什么?如何成为一位优秀的网络安全工程师/黑客?

    网络安全是什么 首先说一下什么是网络安全 网络安全工程师工作内容具体有哪些 网络安全是确保网络系统的硬件 软件及其系统中的数据受到保护 不因偶然的或者恶意的原因而受到破坏 更改 泄露 系统连续可靠正常地运行 保障网络服务不被中断 网络安全工
  • java实现短链接得到长链接!!!

    java实现短链接得到长链接 重点 params setParameter ClientPNames HANDLE REDIRECTS false 禁止重定向 不设置 有些短链接 获取不到headers里的Location HttpClie
  • chrome 全屏模式 隐藏地址栏_6个Chrome隐藏的小技巧,你可能不知道但很实用

    Chrome占据了浏览器的大半壁江山 不少人也是将它作为电脑的默认浏览器 而它也确实非常强大 拥有着非常快的速度以及丰富的插件 同时它也隐藏了不少实用的功能 通过挖掘它们让我们更加意识到Chrome的强大 以下便是我们收集的6个不为大众所熟
  • Linux用户环境变量、系统环境变量和PATH变量

    目录 一 用户环境变量 二 系统环境变量 三 PATH变量 1 修改PATH环境变量 一 用户环境变量 PS 修改文件执行权限案例 1 在文本编辑器中新建一个shell脚本 直接执行这个文件会发现权限不够 以详细模式查看这个文件的权限 发现
  • OpenCV——Sobel边缘检测

    目录 一 Sobel算法 1 算法概述 2 主要函数 二 C 代码 三 python代码 四 结果展示 1 灰度图 2 X方向一阶边缘 2 Y方向一阶边缘 3 整幅图像的一阶边缘 五 相关链接 一 Sobel算法 1 算法概述 Sobel边
  • matplotlib库使用教程:这一篇就够了

    一 导入库 import matplotlib pyplot as plt 二 显示图片 plt imshow imge 负责对图像进行处理 imge类型
  • Zotero安装教程(非常详细)从零基础入门到精通,看完这一篇就够了

    Zotero安装及简单配置 1 引言 Zotero是目前最符合我对文献管理软件需求的一款 在这里简单介绍下其安装教程及我在使用的插件 2 安装及同步设置 2 1 下载 前往官网https www zotero org 点击Download按
  • J2EE&反射

    文章目录 什么是反射 类类 反射实例化 反射动态方法调用 反射读写属性 源代码 什么是反射 Java语言的一种机制 通过这种机制可以动态的实例化对象 读写属性 调用方法 类类 类类 描述类的类 不是官方定义的语言 Class forName