反射
反射是在运行状态中,对于任意一个类,都能知道这个类的所有属性和其中的方法。
对于任何一个对象,都能调用它的任意一个方法和属性,这种动态获取信息及动态调用对象的方法的功能称为java语言的反射机制。即,在运行时,通过反射机制可以动态获取和该类型相关的各种信息。
Class类
Class是对java中所有类型的抽象,即一个Class类型对象可以表示Java中任何一种类型。
每种类型在加载到内存之后,内存中都会生产一个与之对应的Class类型对象,用来表示该类型/
每个类型都有且只有一个Class类型对象与之对应,通过这个Class类型的对象就可以获得到该类型中的各种信息。
Class类是Java反射的入口。
1.基本数据类型
public class TestObj{
public static void main(String[] args){
Class c = int.class;
System.out.println(c.getName());//int
}
}
2.类类型
public class TestObj{
public static void main(String[] args){
Class c = Student.class;
Student s = new Student();
Class c2 = s.getClass();
System.out.println(c==c2);//true
System.out.println(c.getName());//包名.Student
}
}
class Student{
private int id;
private String name;
}
3.还有接口类型和数组类型
获得一个类类型的Class对象的三种方式
1.使用对象调用getClass方法获得。
Student s = new Student();
Class c2 = s.getClass();
2.使用类名获得。
Class c = Student.class;
3.使用Class类中的forName方法获得
这种方法比较灵活,只需要一个字符串类型的参数即可
Class c = Class.forName("包名.类名");
反射机制中的常见类的含义
java.lang包下:
Class类 对java中所有类型抽象而得来的
package类 对java中所有包抽象而得来的
java.lang.reflect包下:
Modifier类 对java中所有修饰符抽象而得来的
Field类 对java中所有属性抽象而得来的
Method类 对java中所有方法抽象而得来的
Constructor 类 对java中所有构造器抽象而得来的
Array类 提供了对数组对象的动态访问
ParameterizedType接口 在反射中表示参数化类型
例如:List Point<Long,Long>等这种带泛型的类型
反射中的常用操作
1.使用反射的方式调用构造器创建类的对象,默认方式:必须调用无参构造器。
Class c = Student.class;
Student s = (Student)c.newInstance();
public class TestObj{
public static void main(String[] args) throws InstantiationException, IllegalAccessException