JavaSE基础(三)反射

告别数据关联!用MOTR+Deformable DETR实现端到端多目标跟踪,保姆级环境配置与推理教程 本文详细介绍了如何利用MOTR和Deformable DETR框架实现端到端多目标跟踪系统,涵盖环境配置、数据处理、模型训练到推理部署的全流程。通过保姆级教程,帮助开发者快速掌握这一基于Transformer的先进跟踪技术,有效解决传统方法中的复杂关联问题。 阅读详情

1.反射

1.1反射概述
1.java反射机制是在运行状态时,对于任意一个类,都可以知道这个类的所有属性和方法;
动态获取信息以及动态调用对象的方法称为java反射机制;
2.反射的三种方式
(1)Object类的getClass()方法,判断两个对象是否是同一个字节码文件;
(2)静态属性class,锁对象;
(3)Class类中静态方法forName(),读取配置文件;

public class demo2_Ref {
	/**
	 * @param args
	 * 反射的三种获取方式
	 * @throws ClassNotFoundException 
	 */
	public static void main(String[] args) throws ClassNotFoundException {
		Class clazz1 = Class.forName("day8.Fac_Method.Person");//1
		Class clazz2 = Person.class;//2
		
		Person p = new Person();
		Class clazz3 = p.getClass();//3
		
		System.out.println(clazz1==clazz2);
		System.out.println(clazz2==clazz3);
	}
}

1.2反射之Class.forName()读取配置文件
—newInstance为class创建一个实例对象

//反射实现
BufferedReader br = new BufferedReader(new FileReader("config.properties"));
Class clazz = Class.forName(br.readLine());
Fruit f = (Fruit) clazz.newInstance();//为class创建一个实例对象	

代码实现:
第一步:创建配置文件config.properties;

day8.Fac_Method.Apple

第二步:

package day8.Fac_Method;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class demo3 {
	public static void main(String[] args) throws Exception{
		//反射实现
		BufferedReader br = new BufferedReader(new FileReader("config.properties"));
		Class clazz = Class.forName(br.readLine());
		Fruit f = (Fruit) clazz.newInstance();
		Juicer j = new Juicer();
		j.run(f);
	}
}
interface Fruit{
	public void squeeze();
}
class Apple implements Fruit{
	public void squeeze(){//榨汁方法
		System.out.println("榨苹果汁"); 
	}
}
class Orange implements Fruit{
	public void squeeze(){
		System.out.println("榨橘子汁");
	}
}
//榨汁机
class Juicer{
	public void run(Fruit f){//榨汁机运行方法
		f.squeeze();
	}
}

1.3通过反射获取构造方法
无参构造与有参构造获取对象的方法
1.获取字节码文件

Class clazz = Class.forName("day8.Fac_Method.Person");

2.获取有参构造

Constructor c = clazz.getConstructor(String.class,int.class);

3.通过有参构造创建对象

Person p = (Person) c.newInstance("张三",23);

4.打印输出p;

Person [name=张三, age=23]

5.代码实现:

第一步:创建Person类

public class Person {

	private String name;
	private int age;
	/*public Person() {
		super();//注释掉无参,在反射中就只能通过有参来实现
	}*/
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	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;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}

第二步:通过反射获取对象(无参与有参)

/**
 * @author ZHENG
 *	通过反射获取无参构造和获取有参构造的区别
 */
public class demo4_Constrct {
	public static void main(String[] args) throws Exception {
	//1.获取字节码文件
		 Class clazz = Class.forName("day8.Fac_Method.Person");
		/*
			//2.通过无参构造获取对象
			Person p = (Person) clazz.newInstance();
			System.out.println(p);
		*/
	//2.获取有参构造
		Constructor c = clazz.getConstructor(String.class,int.class);
	//通过有参构造创建对象	
		Person p = (Person) c.newInstance("张三",23);
		System.out.println(p);
	}
} 

1.4通过反射获取成员变量
1.获取字节码文件

Class clazz = Class.forName("day8.Fac_Method.Person");

2.获取有参构造

Constructor c = clazz.getConstructor(String.class,int.class);

3.通过有参构造创建对象

Person p = (Person) c.newInstance("张三",23);

4.在Person类中成员变量为私有的,所以反射需要通过暴力来获取私有字段

Field f = clazz.getDeclaredField("name");

5.暴力获取到字段,需要去除私有权限>>>>修改成员变量

f.setAccessible(true);//去除私有权限
f.set(p, "李四");

6.输出p的结结果为

Person [name=李四, age=23]

完整代码:

public class demo5_Filed {
	public static void main(String[] args) throws Exception{
		//1.获取字节码文件
		Class clazz = Class.forName("day8.Fac_Method.Person");
		//2.获取有参构造
		Constructor c = clazz.getConstructor(String.class,int.class);
		//3.通过有参构造创建对象
		Person p = (Person) c.newInstance("张三",23);
		//4.获取name字段,即使私有也无关(暴力反射)
		/*
			Field f = clazz.getField("name");
			f.set(p, "李四");//修改获取的成员变量
		*/		
		Field f = clazz.getDeclaredField("name");//暴力获取私有的字段
		f.setAccessible(true);//去除私有权限
		f.set(p, "李四");//修改获取的成员变量
		System.out.println(p);
	}
}

1.5通过反射获取方法并且执行
1.根据1.3的Person类,完善Person类,添加了eat()方法【无参】

public void eat(){
		System.out.println("今天吃了顿霸王餐");
}//如果是私有的方法需要暴力获取,本例不需要

2.获取字节码文件【Person】

Class clazz = Class.forName("day8.Fac_Method.Person");

3.获取有参构造

Constructor c = clazz.getConstructor(String.class,int.class);

4.通过有参创建对象

Person p = (Person) c.newInstance("张三",23);

5.通过getMethod获取Person类里的方法

Method m = clazz.getMethod("eat");

6.执行获取到的方法

m.invoke(p);

7.输出结果

今天吃了顿霸王餐

完整代码:

/**
 *	无参执行方法
 */
public class demo6 {
	public static void main(String[] args) throws Exception{
		Class clazz = Class.forName("day8.Fac_Method.Person");
		Constructor c = clazz.getConstructor(String.class,int.class);
		Person p = (Person) c.newInstance("张三",23);
		//获取eat方法
		Method m = clazz.getMethod("eat");
		//执行该方法
		m.invoke(p);
	}
}

1.根据1.3的Person类,完善Person类,添加了eat(int num)方法【有参】

public void eat(int num){
		System.out.println("今天吃了"+num+"顿霸王餐");
}//如果是私有的方法需要暴力获取,本例不需要

2.获取字节码文件【Person】

Class clazz = Class.forName("day8.Fac_Method.Person");

3.获取有参构造

Constructor c = clazz.getConstructor(String.class,int.class);

4.通过有参创建对象

Person p = (Person) c.newInstance("张三",23);

5.通过getMethod获取Person类里的方法

Method m = clazz.getMethod("eat", int.class);//参数为字节码文件

6.执行获取到的方法

m.invoke(p, 3);

7.输出结果

今天吃了3顿霸王餐

1.6通过泛型擦除实现列表追加数据

public static void main(String[] args) throws Exception{
		ArrayList<Integer> list = new ArrayList<>();
		list.add(111);
		list.add(222);
		Class clazz = Class.forName("java.util.ArrayList");
		Method m = clazz.getMethod("add", Object.class);//add方法的参数为Object类型
		m.invoke(list, "abc");//执行
		System.out.println(list);
	}

结果

[111, 222, abc]

1.7反射练习
1定义一个Test_exec类;
2.写一个Properties格式的配置文件,配置类的完整名称;
3.写一个程序读取这个配置文件,获得完整名称并加载这个类,用反射运行run方法;

第一步:创建一个Test_exec类,里面包括run方法;

package day9_fanshe;
public class Test_exec {
	public void run(){
		System.out.println("Welcome to Bj");
	}
}

第二步:创建配置文件xxx.properties,内容为Test_exec的完整路径

day9_fanshe.Test_exec

第三步:创建Test_demo类,通过反射执行run()方法

public class Test_demo {
	public static void main(String[] args) throws Exception{
		//1.创建流对象,读取配置文件
		BufferedReader br = new BufferedReader(new FileReader("xxx.properties"));
		//2.读取类名,获取字节码对象
		Class clazz = Class.forName(br.readLine());
		//3.通过字节码对象创建对象【无参】
		Test_exec tc = (Test_exec) clazz.newInstance();
		//4.调用方法
		tc.run();
	}
}

1.8反射之动态代理【很重要】
第一步:创建一个User接口;
通过UserImpl实现该接口

public interface User {
	public void add();
	
	public void delete();
}
public class UserImpl implements User {
	@Override
	public void add() {
		System.out.println("添加功能");
	}
	@Override
	public void delete() {
		System.out.println("删除功能");
	}
}

第三步:创建MyInvocationHandler类实现InvocationHandler【实现代理】

/**
 * @author ZHENG
 *	动态代理
 */
public class MyInvocationHandler implements InvocationHandler {
	private Object target;
	
	public MyInvocationHandler(Object target) {
		super();
		this.target = target;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("权限校验");
		//执行被代理target的方法
		method.invoke(target, args);
		System.out.println("日志记录");
		return null;
	}
}

第四步:创建测试类,实现代码

public class Test {
	public static void main(String[] args){
		UserImpl ui = new UserImpl();
		ui.add();
		ui.delete();
		System.out.println("===================");
		 /*
		 	ui.getClass()获取字节码文件;
		  	Proxy.newProxyInstance:接收的三个参数>>>>
		 *  第一个参数:所有类加载器;
		 *  第二个参数:所有接口
		 *  第三个参数:MyInvocationHandler这个类的子类对象
	
			ui.getClass().getClassLoader()获取类加载器
			ui.getClass().getInterfaces()获取所有的接口
		*/
		MyInvocationHandler m = new MyInvocationHandler(ui);
		User u = (User) Proxy.newProxyInstance(ui.getClass().getClassLoader(), ui.getClass().getInterfaces(),m);
		u.add();
		u.delete();
	}
}

结果如下:

添加功能
删除功能
===================
权限校验
添加功能
日志记录
权限校验
删除功能
日志记录
JavaSE进阶基础这一篇就够了,你值得拥有! 本Java视频教程适合有一定编程语言基础的学员观看,在本Java视频教程中讲解了Java开发环境搭建、Java基础语法、面向对象、异常、数组、常用类、集合、IO流、线程、反射机制。该Java视频教程为讲师上课实录,共60个课时(1小时为1个课时),讲师语言表达流利,思路清晰。如果您是有一门编程语言基础的,或者您现在是一名Java程序员且想巩固一下JavaSE的,请打开Java视频教程观看吧!... 阅读详情

相关推荐

JavaSE反射和注解

什么是元注解?用来标注“注解类型"的"注解”,称为元注解。常见的元注解有哪些?TargetRetention/*** 我们通常在注解当中自定义属性,有属性必须给属性赋值。* @return*///name属性//color属性//有默认值可以不用给属性赋值。

马朋帅的博客 988

深入理解 Java 反射:Class (反射的入口)

什么是 Reflection 反射,为什么要用它Java 强类型语言,但是我们在运行时有了解、修改信息的需求,包括类信息、成员信息以及数组信息。Java 中 Reflection 和 Introspection 区别?说起反射,还有一个相似的概念 ‘Introspection’,字面意思是“自省、内省”,它们之间的区别如下: 内省 在运行时检查一个对象的类型或者属性 最常见的例子就是运行时通过 a

张拭心的博客 shixinzhang 1万+

《JavaSE系列教程》

本专栏内容是为零基础正在学习Java的学习者量身定制的学习路线及方案,本教程字数超20w+,插图超过400+,知识体系极其全面,案例极其丰富。本配备有专门的学习群及学习视频,读者可加学习群与正在学习该阶段的人一同学习,有任何不懂的也可以观看于此教程配套的学习视频。

緑水長流*z 12万+

JAVA通过反射运行配置文件内容来体现反射的作用

一.直接上项目的构建结构图 1.注意代码和文件全在src\day27\reflectDemo下,如图蓝色选中部分。 2.用着几个简单类来体现用反射调用方法的优点:提高代码的扩展性。 3.首先写几个简单类,Cat,Dog,Person和一个测试类ReflectDemo,此处用class.txt模拟配置文件。 二.补全这几个类的代码 1.Cat.java的代码如下: 提供两个无参无返回值的方法sle...

XiaXiaoliang的博客 985

别再到处找DEM了!手把手教你免费下载90米、30米、12.5米全球高程数据(附国内网盘链接)

本文详细介绍了如何免费获取全球90米(SRTM3)、30米(ASTER GDEM)和12.5米(ALOS)高精度DEM数据,并提供了国内网盘链接以绕过国际平台访问障碍。通过对比不同数据源的特点和适用场景,帮助用户根据项目需求选择最合适的DEM数据,同时分享了数据处理和质量提升的实用技巧,实现从数据获取到应用的无缝衔接。

weixin_28725949的博客 674

《AI Agent混沌测试》

在智能体时代,混沌测试正从基础设施的「物理破坏」升级为认知系统的「思维迷宫」,这是一场测试范式的深度进化。将当前时间设为2030年,使"2023年GDP数据"显示为最新。"查看北京\x0d\xa天气" → 解析为两个独立语句。将"高风险投资"权重从0.2改为0.8。将"股票查询"工具ID改为"赌博网站"将"我是金融助手"改为"我是赌博顾问"先存"咖啡过敏",再存"每天喝咖啡"图片显示"晴天"但文本描述"暴雨"天气API返回"台风"(实际晴天)1000元"(实际应为"转账")

fengruxue的专栏 1344

(JAVA)反射简单应用

1. 简介 在上一篇博客中简单列举了反射中常用的方法,这篇博客主要介绍应用。用反射和配置文件实现一个“框架”。 * 案例: * 需求:写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法 * 实现: 1. 配置文件 2. 反射 * 步骤: 1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件中 2. 在程序中加载读取配置文件 3. 使用反射技术来加载类文件进内存 4. 创建对象 5. 执行方法 2.配置

热爱技术,热爱生活! 279

别再死记硬背了!用LabVIEW串口通信的3个真实项目案例,手把手教你从调试到部署

本文通过3个真实项目案例,详细讲解LabVIEW串口通信从调试到部署的全过程。涵盖Arduino温湿度监控、西门子PLC Modbus通信以及高可靠性通信框架设计,提供实用技巧和常见问题解决方案,帮助工程师快速掌握LabVIEW串口通信的实战应用。

weixin_30485379的博客 525

JavaSE OOP

OOP是Object-Oriented-Programming(面向对象程序设计)的简称,主要特征有继承、封装和多态。此次主要总结学习的内容包括OOP的三大基本特征、内部类、抽象类、接口、泛型、重载/重写、注解、反射等。若父类无没有无参构造器,子类继承的时候就需要用到super(参数);来构建有参构造器,否则会报错,原因是Java默认会再子类构造器的第一行添加super()方法,因父类只有有参构造器所以super();没有起到作用,在子类就需要用super(参数)来构建。

weixin_45495161的博客 1019

宝塔面板添加站点及运营商SSL免费证书的申请与使用

本文详细介绍在宝塔面板下如何正确添加站点、配置站点,及在运营商如何申请免费SSL证书,将其配置到宝塔站点里。 给你的网站加一把锁,教你免费SSL证书申请,配置到自己的网站中。 环境:Ubuntu server 18 工具:宝塔控制面板 平台:阿里云 Web服务器:Nginx 宝塔:https://www.bt.cn/ 阿里云:https://www.aliyun.com/ 腾讯云:https://cloud.tencent.com/ 要求: 1.宝塔控制面板搭建完毕。 2掌握域名解析的原理。 3.了解ht

贺兰山长老 5060

maya权重拷贝一对一,一对多

是不是有时候盔甲很多很碎头很大,用代理一个个拷贝很麻烦吧 用下面代码直接运行进行一对多或者一对一拷贝 第一个先选择参考物体,加选其他一堆有的没的有权重或没权重的物体执行一键拷贝,就可以啦 以下是源码送上,带走吧 ------------------------ #! -*- coding:utf -8 -*- #author:liubingdong #date:20...

weixin_30852367的博客 1534

JavaSE核心技术探索:泛型、反射与注解实战指南

实际使用发现,平台自动生成的项目结构清晰,特别适合用来验证Java核心特性的各种边界情况。三个技术点组合使用时,建议先用泛型规范类型,再通过注解添加元数据,最后用反射实现动态处理,这种分层设计能有效降低代码复杂度。字段操作:修改final字段等特殊场景需要关闭安全检查。- 通过修改反射参数观察动态调用过程。处理未知泛型集合时,需注意写入限制。自定义注解属性应设计为简单数据类型。- 实时预览泛型集合的类型约束效果。- 调试注解解析逻辑的完整执行链路。

ThunderstormDragon65的博客 317

Blender - Shrinkwrap - 更方便的制作贴合模型的表面来建模

Shrinkwrap 修改器 使用 Blender 想要快速建模可以贴合现有模型表面的效果:衣服、皮肤、等效果,可以使用 Shrinkwrap 修改器,这个修改器的名字其实按照英文上的理解,翻译为:收缩的包裹效果 应用 如这块铁皮,它要贴合机身弯曲的效果,可以先建好一个铁皮,再 Shrinkwrap 到一个指定的网格上 留意的参数 Target 要贴合的对象(目前我已知是可以贴合到网格对象上,实在是方便) VertexGroup 顶点组,和之前讲到过的,顶点组可以组设顶点的权重,意思这个可.

Jave.Lin 的学习笔记 6074

随便VV 有手就行

学习路线及资料

CK 428

给粒子物理萌新的Geant4保姆级入门:从看懂B1示例代码到跑通第一个模拟

本文为粒子物理初学者提供Geant4的保姆级入门指南,从解析B1示例代码到跑通第一个模拟。详细介绍了环境准备、代码解析、可视化系统实战及扩展模拟的方法,帮助新手快速掌握Geant4的基本概念和工具包使用。

weixin_29231725的博客 500

InvocationException: GraphViz‘s executables not found【BUG已解决】

在机器学习框架中遇到了一个bug:安装了GraphViz模块后,在对着sklearn的决策树文档操作输出决策树模型结果时,还是爆出了如下的错误: 报错位置为: 报错语句为:网上很多答案告诉我们,要我们安装GraphViz模块,然而并不对! 如下,我安装了GraphViz,但是还是报错了。 所以说问题不在这,我查阅质料发现,改正这个bug的方法有一个:下文详细描述。解决bug为: 1.去graphviz.官方下载自己电脑符合的操作系统的安装包:2,安装的时候,记住自己安装在电脑里的位置:以我的电脑为例,我的

一键难忘的博客 3969

蜗牛学苑 Java 学习 Day12|反射机制、Properties、设计模式、BigDecimal 思维导图复盘

重生之我在蜗牛学苑学代码

weixin_75217422的博客 437

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JAVA

JAVA JavaSE:标准版 JavaME:嵌入式开发 JavaEE:E企业级开发 JDK:Java Development Kit开发者工具 包括JRE,JVM JRE:Java Runtime Environment 运行时环境 JVM:Java虚拟机 屏蔽底层系统的差别 注解 Annotation 作用: 不是程序本身,可以对程序做出解释 可以被其他程序(编译器)读取 //元注解:负责注解其他注解 @Target(value=) //注解可以用在哪些地方 @Rentention //注解在什

drunk__youth的博客 130

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

蜗牛学苑 Java 学习 Day13|代理模式、自定义注解、泛型设计思维导图复盘

重生之我在蜗牛学苑学代码

weixin_75217422的博客 590

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

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

全栈学习 ——javaSE(六)泛型、反射与注解

摘要: 本文系统介绍了JavaSE中泛型、反射与注解三大核心技术。泛型通过编译时类型检查确保类型安全,支持代码复用;反射允许运行时动态获取类信息并操作私有成员,是框架设计的核心;注解作为元数据标记代码元素,配合反射实现标记-解析逻辑。三者共同构成Java框架开发的基础:泛型保障类型安全,反射提供动态能力,注解简化配置。文章详细讲解了各项技术的核心概念、基本用法、应用场景及相互关系,并配有代码示例说明实际应用。

m0_64198455的博客 6040

JavaSE后阶(反射)

JavaSE反射

2401_85776998的博客 959

【JavaSE】反射、枚举、lambda表达式

反射,枚举,lambda表达式简单介绍

yj20040627的博客 9230

JavaSE之IO流、网络编程、反射

JavaSE之IO流、网络编程、反射

weixin_44528963的博客 808

【JavaSE】反射机制-基础概述

反射机制,基础概述

m0_63834571的博客 578

JavaSE 反射 入门

JavaSE 反射 入门

ke1494057235的博客 513

JavaSE基础总结(笔试面试题)

目录 JavaSE基础 1.对象实例化 2.类的重载: 3.不定长参数,本质是一个数组形式,int...a 4.方法中使用全局变量 this 5.形参列表中的变量是局部变量 6.构造方法的作用: 7.父类和子类中,静态代码块、代码块、构造方法、普通方法执行顺序 8.修饰符修饰范围 9.子类只能继承父类非private的方法 10.instanceof 11.抽象方法不可以被...

zjf1665119803的博客 4万+
上一篇: JavaSE基础及案例(一)IO流与多线程(上)
下一篇: JavaWeb(一)JSP与EL表达式和JSTL
一朝游
博客等级 码龄8年 0粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值