首先说下反射是什么?反射是Sun公司推出的一组API,此组API位于Java.lang.reflect中
反射的作用是编写工具(例如eclipse),编写框架,当然对于一般的程序,我们不可能用反射来做这些事,一般反射大多是用于在构建类的实例以及调用类方法及属性。
ok! 了解了反射是什么以及反射的应用领域,那么就来看看Java中是怎么实现反射的吧
Student类
public class Student { public String name; public String gender; public int age; public Student(){ }}
使用反射获取类的实例
public class Test { public static void main(String[] args)throws ReflectiveOperationException { //通过三种方式获取类的类对象 Class c=Student.class; Class c1=new Student().getClass(); Class c2=Class.forName("Student");//通过包名.类名获取类对象(因为该类在default包,所以可以不写包名) //通过类对象来构建student实例,效果和new Student()一样,要求Student中必须要有无参的构造函数 Student s=(Student) c.newInstance(); Student s1=(Student) c1.newInstance(); Student s2=(Student) c2.newInstance(); s.age=1; s1.age=2; s2.age=3; System.out.println(s.age); System.out.println(s1.age); System.out.println(s2.age); }
可以看到,正确的输出了1,2,3
通过反射获取类的属性及方法,动态执行
最流行的java后台框架 springmvc mybaits
Student类型
public class Student { public String name; private int age;//该属性为私有,可以通过反射获取得到 public Student(){ } public int add(int a,int b){ return a+b; } @Override public String toString() { // TODO Auto-generated method stub return "name="+name+"\nage="+age; }}
动态的给类的属性赋值和调用类的方法
public class Test { public static void main(String[] args)throws ReflectiveOperationException { //获取类对象 Class c=Class.forName("Student"); //获取类的属性对象,需要填写属性对象的名称 Field f1=c.getField("name");//只能获取public的对象 Field f2=c.getDeclaredField("age");//可以获取到private的对象,这很吊吧 f2.setAccessible(true);//如果属性是私有的,那么就需要设置可访问 Student s1=(Student) c.newInstance(); //为属性对象赋值 f1.set(s1, "张三"); f2.set(s1, 22); System.out.println(s1.toString()); //通过类对象获取类的方法 Method m1=c.getMethod("add", int.class,int.class); //动态的执行方法 int sum=(int) m1.invoke(s1, 1,2); System.out.println(sum); }}