反射是java中提供的一种机制,它允许我们在程序运行的时候,动态获取一个类中的基本信息,并且可以调用类中的属性,方法,构造器.
public class Student{ private String name; int age; public static int num; public Student(){} public Student(String name,int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String sayHello(String name){ return "hello! "+name; } }我们除了使用眼睛看到这个类中的属性方法构造器之外,在代码运行的时候,也可以通过反射机制获取到这个类中的属性,方法,构造器,已经调用构造器和方法.
Class c = Class.forName("com.briup.demo.Student"); Field[] fields = c.getDeclaredFields(); for(Field f : fields){ System.out.println("属性的修饰符:"+Modifier.toString(f.getModifiers())); System.out.println("属性的类型:"+f.getType().getName()); System.out.println("属性的名称:"+f.getName()); System.out.println("---------------------"); }java.lang.Class 是API中提供的一个类,它可以表示java中所有的类型,包括基本类型和引用类型.
getClass方法的返回类型就是Class,所以obj.getClass();这句代码的含义就是,返回obj引用在运行时所指向对象的实际类型.
Class类型可以表示基本类型,数组类型,接口类型,类类型,每种类型加载到内存之后,都会在内存中生成一个Class类型对象,这个对象就代表这个具体的java类型,并且保存这个类型中的基本信息.
注意:java中的每种类型都有且只有唯一的一个Class类型对象与之对应!并且在类加载的时候自动生成
获取基本类型的Class对象
只有一种: Class c = int.class;
获取接口类型的Class对象有两种方法
Class c1 = Action.class;
Class c2 = Class.forName(“com.briup.demo.Action”);
获取数组类的Class对象有两种方法
Class c1 = int[].class; int[] arr = new int[4];Class c2 = arr.getClass();获取类类型的Class对象有三种方法
Class c1 = Student.class;Class c2 = Class.forName(“com.briup.demo.Student”);Student stu = new Student(); Class c3 = stu.getClass();可以看出,获取一个类型Class对象的途径一般有三种
使用类型名称直接获取-使用Class类中的静态方法forName获取使用对象调用getClass方法获取Field[] getFields()
Field getFiled(String name)
获取类中声明的属性(包含私有的),但是不能获取从父类中继承过来的属性 Field[] getDeclaredFields()Field getDeclaredField(String name)java.lang.reflect.Field 表示类中的属性
public Constructor[] getConstructors()
public Constructor getConstructor(Class… parameterTypes)
获取当前类中的所有构造器,包含私有public Constructor[] getDeclaredConstructors()
public Constructor getDeclaredConstructor(Class… parameterTypes)