java--反射(一)

java--反射(一)

一、反射

   元数据(MetaData) 描述数据结构的结构;反射就是得到元数据的行为。

二、反射引入

 

  • Object obj = new Student();

若程序运行时接收到外部传入的一个对象,该对象的编译类型是Object,但程序又需要调用该对象运行类型的方法:
1.若编译和运行类型都知道,使用 instanceof判断后,强转。
2.编译时根本无法预知该对象属于什么类,程序只能依靠运行时信息来发现对象的真实信息,这时就必须使用反射了。

3.要是想得到对象真正的类型,就得使用反射。

三、Class类和Class类实例

 

  • Java程序中的各个Java类属于同一类事物,描述这类事物的Java类就是Class类。
  • 对比提问:众多的人用一个什么类表示?众多的Java类用一个什么类表示?

 

人   Person

 

Java类    Class

 

 

  • 对比提问: Person类代表人,它的实例对象就是张三,李四这样一个个具体的人,Class类代表Java类,它的各个实例对象又分别对应什么呢?

 

 

  1. 对应各个类在内存中的字节码,例如,Person类的字节码,ArrayList类的字节码,等等;
  2. 一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的;
  3. 一个类在虚拟机中只有一份字节码;

 

 

四、获得Class对象

 

  • 如何得到各个字节码对应的实例对象?
  • 每个类被加载后,系统会为该类生成对应的Class对象,通过Class对象可以访问到JVM中的这个类,3种方式:

 

 

 

  1. 使用Class类的forName(String className)静态方法,className表示全限定名;如String的全限定名:java.lang.String;
  2. 调用某个类的class属性获取Class对象,如Date.class会返回Date类对应的Class对象(其实就是得到一个类的一份字节码文件);
  3. 调用某个对象的getClass()方法。该方法属于Object类;

 

 

Class<?> clz = new Date().getClass();

 

 

获取对象实例

package reflect;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;


enum Gender{
	MAN,WOMAN(),NONE{};
}
class User{
	
}


/**
 *	得到Class对象的三种方式:
 *
 *	1. 通过类的class属性;
 *		类.class;
 *、	2. 使用Class.forName(String className);className表示 一个类的全限定名
 *		
 *			Class clz = Class.forName("java.util.Date");
 *			此时 clz 就在描述 java.util.Date这个类
 *
 *	3. 通过对象的一个 getClass()方法可以搞定
 *		Class<?> getClass()    返回此 Object 的运行时类。 
 *
 */
public class ClassDemo {
	String name;
	public static void main(String[] args) throws Exception {
		
			//得到Usre的字节码
			Class<User> clz = User.class;
			Class<User> clz2 = reflect.User.class;
			System.out.println(clz == clz2);
			
			String className = "java.util.Date";
			
			/**
			 * public static Class<?> forName(String className)
			 * 	
			 * 
			 * 	Class<?> clz = Class.forName("java.lang.String");
			 */
			 Class<?> clz3 = Class.forName(className);
			Class<Date> clzDate = (Class<Date>) clz3;
			System.out.println(clzDate);
			
			System.out.println(clz == Class.forName("reflect.User"));//true
			
			
			List l = new ArrayList();
			
			
			Class<?> clzList = l.getClass();
			//现在获得l的真实类型
			System.out.println(l.getClass());//java.util.ArrayList
			
			
			//得到对象的真正类型
			/**
			 * enum Gender{
				MAN,WOMAN(),NONE{};
			  }
			 */
			
			System.out.println("Gender.MAN= "+Gender.MAN.getClass());//reflect.Gender
			System.out.println("Gender.WOMAN= "+Gender.WOMAN.getClass());//reflect.Gender
			System.out.println("Gender.NONE= "+Gender.NONE.getClass());//reflect.Gender$1
	
			System.out.println(Map.class);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值