反射

本文深入讲解Java反射机制,包括反射的概念、获取类对象的三种方式、如何通过反射实例化对象、调用私有构造器、动态调用方法、以及属性的赋值与取值等核心内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1什么是反射

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

1.2反射获取类对象(三种方式)

*1.Class.forName(“类的全路径名”); jdbc,自定义mvc框架要用
2.类名.class 做通用的查询
3.类(Class类类的类对象)实例.getClass() 做通用的增删改
*
首先一个Student类

package com.chenkang.reflect;

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("调用带二个参数的构造方法创建了一个学生对象");
	}

	@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("你好!我是" + this.sname);
	}

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

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

执行代码

package com.chenkang.reflect;
public class Demo1 {
	public static void main(String[] args) throws Exception {
		Class<?> clz = Class.forName("com.chenkang.reflect.Student");
		
		
		Class<?> clz1=Student.class;
		System.out.println(clz1);
		
		
		Student stu=new Student();
		Class<?> clz11=stu.getClass();
		System.out.println(clz11);
	}
}

输出结果
在这里插入图片描述

1.3通过反射进行实例化

1.能够实例化未知的类
2.能够通过私有构造器创建实例

代码块

package com.chenkang.reflect;

import java.lang.reflect.Constructor;

/**
 * 反射实例化
 * 1.能够实例化未知的类
 * 2.能够通过私有构造器创建实例
 * @author 20190528
 *
 */
public class Demo2 {
	public static void main(String[] args) throws Exception {
		 Class clz=Student.class;
//		1.反射 调用无参构造方法创建了一个学生对象
//		 Student stu = (Student) clz.newInstance(); 
		 
//		2.调用一个参数的构造方法创建了一个学生对象
//		Constructor con=clz.getConstructor(String.class);
//		Student stu = (Student)con.newInstance("s001");
		 
//		 3.调用一个参数的构造方法创建了一个学生对象
//		 Constructor con=clz.getConstructor(String.class,String.class);
//		Student stu = (Student)con.newInstance("s001","zs");
//		(getConstructor)只能寻找到punlic修饰的构造器
//		 Constructor con=clz.getConstructor(Integer.class);
		 
//		 4.调用Student类私有的构造方法创建一个学生对象
//		 (getDeclaredConstructor)可以寻找到任何修饰的构造器
		 Constructor con=clz.getDeclaredConstructor(Integer.class);
		 con.setAccessible(true);
////		通过构造器实例化对象
		Student stu = (Student)con.newInstance(13);
		
		
	}
}

运行结果就是那四条!!!!!

1.4反射动态调用方法

代码块

package com.chenkang.reflect;

import java.lang.reflect.Method;

/**
 * 反射调用方法
 * AddOrderServlet
 * DelOrderServlet
 * @author 20190528
 *
 */
public class Demo3 {
	public static void main(String[] args) throws Exception {
		Student stu=new Student();
//		stu.hello();
		Class clz=stu.getClass();
//		Method m=clz.getDeclaredMethod("hello");
//		m.invoke(stu);
		
		
//		Method m=clz.getDeclaredMethod("hello",String.class);
//		m.invoke(stu,"zs");
		
		Method m=clz.getDeclaredMethod("add",Integer.class,Integer.class);
		m.setAccessible(true);
//		invoke:如果反射动态调用的方法是被void修饰,那么返回的是null
//		如果反射动态调用的方法不是被void修饰,那么返回的是被调用的返回值
		Object invoke = m.invoke(stu,20,5);
		System.out.println(invoke);
	}
}

运行结果
在这里插入图片描述

1.5、反射属性赋值取值

代码块

package com.chenkang.reflect;

import java.lang.reflect.Field;

/**
 * 反射属性赋值取值
 * -->
 * 反射能够将jsp传递过来的参数封装到实体类中
 * @author 20190528
 *
 */
public class Demo4 {
	public static void main(String[] args) throws Exception {
		Student stu=new Student("s002","zs");
//		面向对象的赋值
//		stu.setSid("s001");
		stu.age=22;
//		System.out.println(stu);
//		反射赋值
//		写属性
		Class clz = stu.getClass();
//		Field field = clz.getDeclaredField("sid");
//		field.setAccessible(true);
//		field.set(stu, "s002");
//		System.out.println(stu);
//		读属性
//		System.out.println(field.get(stu));
		
		
		Field[] fields = clz.getDeclaredFields();
		for (Field field : fields) {
			field.setAccessible(true);
			System.out.println(field.getName()+":"+field.get(stu));
		}
	}
}

输出结果
在这里插入图片描述

资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 在本文中,我们将探讨如何通过 Vue.js 实现一个带有动画效果的“回到顶部”功能。Vue.js 是一款用于构建用户界面的流行 JavaScript 框架,其组件化和响应式设计让实现这种交互功能变得十分便捷。 首先,我们来分析 HTML 代码。在这个示例中,存在一个 ID 为 back-to-top 的 div 元素,其中包含两个 span 标签,分别显示“回到”和“顶部”文字。该 div 元素绑定了 Vue.js 的 @click 事件处理器 backToTop,用于处理点击事件,同时还绑定了 v-show 指令来控制按钮的显示与隐藏。v-cloak 指令的作用是在 Vue 实例渲染完成之前隐藏该元素,避免出现闪烁现象。 CSS 部分(backTop.css)主要负责样式设计。它首先清除了一些默认的边距和填充,对 html 和 body 进行了全屏布局,并设置了相对定位。.back-to-top 类则定义了“回到顶部”按钮的样式,包括其位置、圆角、阴影、填充以及悬停时背景颜色的变化。此外,与 v-cloak 相关的 CSS 确保在 Vue 实例加载过程中隐藏该元素。每个 .page 类代表一个页面,每个页面的高度设置为 400px,用于模拟多页面的滚动效果。 接下来是 JavaScript 部分(backTop.js)。在这里,我们创建了一个 Vue 实例。实例的 el 属性指定 Vue 将挂载到的 DOM 元素(#back-to-top)。data 对象中包含三个属性:backTopShow 用于控制按钮的显示状态;backTopAllow 用于防止用户快速连续点击;backSeconds 定义了回到顶部所需的时间;showPx 则规定了滚动多少像素后显示“回到顶部”按钮。 在 V
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值