在学习反射之前,我们得到一个类,那么我们就会想到给这个类实例化一个对象,然后通过这个对象调用类的方法与属性。学习了反射,我们可以通过类的对象获取到类对象,然后通过类对象去获取类的属性和方法,最后调用,这个获取的方法也可以是此类的私有方法。(看起来和用起来都挺麻烦,但特别的方式就有特别的用处)
1、什么是类对象
类的对象:基于某个类new·出来的对象,也称实例对象。
类对象:类加载的产物,封装了一个类的所有信息(类名、父类、接口、属性、方法、构造方法)。
2、获取类对象的方法
//通过类的对象,获取类对象。
Student s=new Student();
class c=s.getClass(); //此处的类对象则是Student
//通过类名获取类对象。
Class c=类名.class;
//通过静态方法获取类对象.
Class c=Class.forName("包名.类名");
3、反射通用操作
3.1常见方法
所有的方法使用的方法都是类对象.方法名,返回值则是public·后面的类型。
重点是如何获取想要的方法,并且通过类对象实行对该方法的调用。
import java.lang.reflect.Method;
public class Fanshe {
public static void main(String[] args) {
//以猫类作为示范
// public class Cat {
//
// public void eat(String food) {
// System.out.println("猫吃"+food);
// }
// }
//一直猫类的全限定名为:com.kaiven.biji.Cat
//首先获取猫的类对象
try {
Class cat=Class.forName("com.kaiven.biji.Cat");
//获取猫的eat方法 ,getMethod方法的第一个参数为方法名,第二个参数为参数类型.class,想要获取的方法中的参数,如有多个逗号分隔。
Method m=cat.getMethod("eat", String.class);
//准备调用该方法
//1创建实例对象
Object o=cat.newInstance();
//2通过实例对象调用该方法 调用方式为:方法.invoke(创建的对象,传递的给参数的值);
m.invoke(o, "鱼");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
利用反射调用方法可以无视是否私有方法
//获取私有方法 Method
privateMethod=class1.getDeclaredMethod("privateMethod");
//设置访问权限无效 (关键是这一步)
privateMethod.setAccessible(true);
privateMethod.invoke(zhangsan);
//获取私有属性也同样如此
//获取name属性 Field
namefield=class1.getDeclaredField("name");
namefield.setAccessible(true);
Person zhangsan=(Person)class1.newInstance();
namefield.set(zhangsan, "张三"); //zhangsan.name="张三";
找不到合适的方法来描述反射,等实际用上了再回来添加。