![20a2bed2a2c0935a9dd188dd90caa1c8.gif](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/497a9750dc665bab8429521e54c1e1cc.png)
尚学堂百战程序员
百战程序员_IT6000集_影响6000万学习IT的中国人【官网】