获取class属性_反射机制介绍_Class对象获取

20a2bed2a2c0935a9dd188dd90caa1c8.gif

1、反射机制是 Java 的动态性之一

动态语言:在程序运行时,可以改变程序的结构或变量的类型。

举例:

JavaScript :

<html>
	<head>
		<title>js代码</title>
		<script>
			function test(){
				var s = "var a = 3; var b = 4; alert(a+b);";
				eval(s);
			}
		</script>
	</head>
	<body>
		<input type="button" onclick="test()" value="测试" />
	</body>
</html>

运行结果:

30a1c506f3feaa21571d043718723dbe.png

java:

public class Test {
	public static void main(String[] args) {
		String s = "int a=3;int b=4;Systemm.out.println(a+b);";
		System.out.println(s);
	}
}

运行结果:

1bf0b9984ee0ddd0843a3024f540b897.png

典型的动态语言Python、ruby、JavaScrip

C,C++,Java 不是动态语言,但具有一定的动态性,可以 称为”准动态语言”,具备类似动态语言的特性。传一块代码来动态的执行,动态的处理,Java 也能做,可以利用反射来实现类似的功能。 Java的动态性让编程变得更加的灵活,功能就更加的强大。

2、反射机制

程序在运行的过程中加载一些“只知道相关名字”的类,以下代码,在程序运行时加载 User 类。

Class c = Class.forName("cn.sxt.entity.User");

一个类被加载后,JVM 会创建一个对应类的 Class 对象, 类的整个结构信息会被放到 Class 对象中。 这个 Class 对象就像镜子一样,通过这面镜子,可以得到对应类的全部信息。

d6158e4d19d15ec0c8560490e6e5203d.png

3、反射机制的常见作用

1) 动态的加载类、动态的获取类的信息(属性,方法,构造器)

2) 动态构造对象

3) 动态调用类和对象的任意方法、构造器

4) 动态调用和处理属性

5) 获取泛型信息

6) 处理注解

4、获取 Class 对象的方式(查看API-java.lang.Class)

Class类的类表示正在运行的Java应用程序中的类和接口枚举是一种类,一个注释是一种界面。 每个数组也属于一个反映为类对象的类,该对象由具有相同元素类型和维数的所有数组共享原始数据类型(boolean,byte,char,short,int,long,float,double),和关键字void也表示为类对象。

1) 通过字节码文件

2) 对象的getClass()方法

3) Class 类的静态方法 forName(String className)

public class TestReflection {	
	public static void main(String[] args) throws ClassNotFoundException {
		System.out.println(int.class);
		System.out.println(void.class);

		/** 维数相同并且类型相同的数组共享同一个Class对象 */
		int[] arrA = new int[10];
		int[] arrB = new int[30];
		System.out.println(arrA.getClass() == arrB.getClass());
		
		/** 同一个类的n多对象,共享同一个Class对象 */
		User u1 = new User();
		User u2 = new User();
		System.out.println(u1.getClass() == u2.getClass());
		
		/** 获取Class对象的三种方式 */
		//(1)通过对象的getClass()方法获取
		Class c1 = u1.getClass();
		//(2)通过字节码文件获取
		Class c2 = User.class;
		//(3)通过Class类的静态方法forName(String className)获取
		Class c3 = Class.forName("cn.sxt.reflection1.User");//User.class.getName()
	}
}
class User {
	private int userId;
	private String userName;
	private String password;
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

运行结果:

497a9750dc665bab8429521e54c1e1cc.png

尚学堂百战程序员

百战程序员_IT6000集_影响6000万学习IT的中国人【官网】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值