反射:
反射的概念:其实就是将 java中所有的后缀为.class的这一类事物描述为具体的一个类,通俗:反射就是一堆class文件,Class类描述的是所有的class文件的共性。
如果我要找到一个String.class Class类的对象(实例Instance)。
class文件被描述为Class类
class文件中的属性被描述为Field类
class文件中的方法被描述为Method类
class文件中的构造函数被描述为Constructor类
Class类的对象的获取:
package com.lsh.reflect;
//javabean/实体
public class User {
private String name;
private int age;
public User(){
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.lsh.reflect;
/*
* //通过反射获取对象的三种方式:
* 1.类名.class属性
* 2.new 类名().getClass()方法
* 3.Class.forName(“包名+类名”)
*
*/
public class ReflectDemo {
public static void getClazz() throws Exception{
//获取User类的class对象
//第一种方式:类名.class属性
Class clazz1 = User.class;
//第二种方式:new 类名().getClass()方法
Class clazz2 = new User().getClass();
//第三种方式:Class.forName(“包名+类名”)
Class clazz3 = Class.forName("com.lsh.reflect.User");
System.out.println(clazz1 == clazz2);//ture
System.out.println(clazz2 == clazz3);//ture
System.out.println(clazz1 == clazz3);//ture
}
public static void main(String[] args) throws Exception {
getClazz();
}
}
输出结果为:
ture
true
true
既然可以使用三种不同的方式获取任意一个类的Class对象,那么在实际的项目开发中,到底使用哪一种呢?
由于反射主要的任务的是做框架开发,在这些已经实现的框架中完全使用的是反射技术。在一般的框架实现中都采用的是将类的完整路径配置在xml文件中,这样程序在启动的时候可以通过IO技术获取该类的全名,那么最常用的就是方式三获取该类的Class对象进行进一步在操作。
方式三:Class 变量名 = Class.forName("包名+类名");
总结:其实反射就是将class文件中的不同的部分都封装为具体的对象,进而便于操作。