黑马程序员——Java基础——反射

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


一、概述

反射就是把Java类中的各种成分映射成一个个的java对象。例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象,对类进行解剖。

二、Class

一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型就是Class。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。
如何得到各个字节码对应的实例对象(Class类型)?
public class ReflectDemo1 {

	public static void main(String[] args) throws Exception {
		//加载类字节码的三种方法
		//1.Object类的getClass方法
		Class clazz1 = new ReflectClass().getClass();
		//2.数据类型的静态的class属性
		Class clazz2 = ReflectClass.class;
		//3.通过Class类的静态方法forName
		Class clazz3 = Class.forName("test.day4.ReflectClass");
		
		System.out.println(clazz1.getName());
		System.out.println(clazz2.getName());
		System.out.println(clazz3.getName());
				
		
	}

}

三、构造函数——Constructor
public class ReflectClass {

	public ReflectClass() 
	{
		System.out.println("无参的公有构造函数");	
	}
	
	public ReflectClass(String str) 
	{
		System.out.println("有参的公有构造函数:"+str);	
	}
	private  ReflectClass(int num ) 
	{
		System.out.println("有参的私有构造函数:"+num);	
	}

}
import java.lang.reflect.Constructor;


public class ReflectDemo2 {

	public static void main(String[] args) throws Exception {
		
		Class clazz = Class.forName("test.day4.ReflectClass");
		
		//通过反射无参的公有构造函数创建对象
		Constructor c1 = clazz.getConstructor(null);
		ReflectClass rc1 = (ReflectClass)c1.newInstance(null);
		
		//通过反射有参的公有构造函数创建对象
		Constructor c2 = clazz.getConstructor(String.class);
		ReflectClass rc2 = (ReflectClass)c2.newInstance("java");
		
		//通过反射有参的私有构造函数创建对象,私有需要暴力反射
		Constructor c3 = clazz.getDeclaredConstructor(int.class);
		c3.setAccessible(true);
		ReflectClass rc3 = (ReflectClass)c3.newInstance(1);
		
		
	}

}


四、成员方法——Method
类中有一个特殊的方法,就是主函数
public class ReflectClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println("反射类的主函数:"+args);
	}
	public void show()
	{
		System.out.println("无参的公有成员函数");
	}	
	public void show(String str)
	{
		System.out.println("有参的公有成员函数:"+str);
	}

	public void show(String[] strs,int num)
	{
		System.out.println("多个参数(包含数组)的公有成员函数:"+strs+":"+num);
	}	

	public String function(String str)
	{
		return "带返回值的有参公有成员函数:"+str;
	}	
	private String function(int num)
	{
		return "带返回值的有参私有成员函数:"+num;
	}
	public static String function(boolean b)
	{
		return "静态的有返回值的有参公有成员函数:"+b;
	}
}
import java.lang.reflect.Method;

public class ReflectDemo3 {

	public static void main(String[] args) throws Exception {
		
		Class clazz = Class.forName("test.day4.ReflectClass");
		ReflectClass rc = new ReflectClass();
		
		//反射获取类的主函数
		Method method1 = clazz.getMethod("main", String[].class);
		method1.invoke(null, (Object)new String[]{"java01","java02"});
		
		//反射无参的公有成员函数
		Method method2 = clazz.getMethod("show", null);
		method2.invoke(rc, null);
		
		//反射有参的公有成员函数
		Method method3 = clazz.getMethod("show", String.class);
		method3.invoke(rc, "java01");
		
		//反射多个参数(包含数组)的公有成员函数
		Method method4 = clazz.getMethod("show", String[].class,int.class);
		method4.invoke(rc,new String[]{"java01","java02"},123);
		
		//反射带返回值的有参公有成员函数
		Method method5 = clazz.getMethod("function", String.class);
		String s1 = (String)method5.invoke(rc, "java01");
		System.out.println(s1);
		
		//反射带返回值的有参私有成员函数
		Method method6 = clazz.getDeclaredMethod("function", int.class);
		method6.setAccessible(true);
		String s2 = (String)method6.invoke(rc, 2);
		System.out.println(s2);
		
		//反射无参的公有成员函数
		Method method7 = clazz.getMethod("function", boolean.class);
		String s3 = (String)method7.invoke(null, true);
		System.out.println(s3);
	}

}


五、成员变量——Field
public class ReflectClass {

	public String str;
	private int num;
	public static int count;
	public final String s = "reflectclass";
	
	public String getStr() {
		return str;
	}
	public int getNum() {
		return num;
	}
	public static int getCount() {
		return count;
	}
	public String getS() {
		return s;
	}

}
import java.lang.reflect.Field;

public class ReflectDemo4 {

	public static void main(String[] args) throws Exception {

		Class clazz = Class.forName("test.day4.ReflectClass");
		ReflectClass rc = new ReflectClass();

		// 反射获取公有的成员变量
		Field f1 = clazz.getField("str");
		f1.set(rc, "java01");
		System.out.println("公有成员变量:" + rc.getStr());


		// 反射获取私有的成员变量
		Field f2 = clazz.getDeclaredField("num");
		f2.setAccessible(true);
		f2.set(rc, 1020);
		System.out.println("私有成员变量:" + rc.getNum());

		// 反射获取公有的静态成员变量
		Field f3 = clazz.getField("count");
		f3.set(null, 20);
		System.out.println("公有成员变量:" + ReflectClass.getCount());

		// 反射获取公有的最终类型成员变量
		Field f4 = clazz.getField("s");
		String s = (String) f4.get(rc);
		System.out.println("公有最终类型的成员变量:"+s);


	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
黑马程序员的tb_brand是指在JavaWeb基础教程中创建的一个表。这个表是用来存储品牌信息的,具体的表结构和数据类型需要和JavaBean类中的成员变量保持一致。\[1\]在这个教程中,使用了Maven来构建项目,并且使用了MyBatis作为持久层框架,通过配置pom.xml文件来引入相关依赖。\[2\] Maven是一个用于管理和构建Java项目的工具,它提供了一套标准化的项目结构、构建流程和依赖管理机制。\[3\] #### 引用[.reference_title] - *1* [【JAVAWEB开发】黑马程序员java web案例资料(含Element的删除与修改)](https://blog.csdn.net/aasd23/article/details/126940147)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [黑马程序员-MyBatis 框架-最全入门笔记、阿伟看了都得说真大、真细、真全!!!](https://blog.csdn.net/qq_57383364/article/details/128103058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [JavaWeb——黑马程序员课程笔记](https://blog.csdn.net/King_ZACC/article/details/128573804)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值