JAVA反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
获取Class对象有三种方式:
1.通过Object类的getClass()方法。例如:
Class c1 = new String("").getClass();
2.通过Class类的静态方法——forName()来实现:
Class c2 = Class.forName("MyObject"); //传入一个类名的字符串
3.如果T是一个已定义的类型的话,在java中,它的.class文件名:T.class就代表了与其匹配的Class对象,例如:
Class c3 = Manager.class;
Class c4 = int.class;
Class c5 = Double[].class;
了解类的信息
获得本类声明的方法
getName(); //这个方法就是返回String形式的该类的简要描述
获得所有方法
ClassdogClazz = Dog.class;
Method[] methods = dogClazz.getMethods(); //获得所有公共的方法
Method[] methods2 = dogClazz.getDeclaredMethods(); //获得自己定义的方法
获得父类信息
Class superClazz = chineseClazz.getSuperclass();
获得接口信息
Class[] interfaceClazz = chineseClazz.getInterfaces();
根据Class对象创建instance
方法1
ClassdogClazz = Dog.class;
Object o = dogClazz.newInstance(); //Dog类中必须有无参的构造函数
方法2
Constructor c = dogClazz.getConstructor(new Class[]{String.class, int.class}); //根据Dog类中的构造函数,创建一个构造器。
Dog o2 = (Dog) c.newInstance("xiaohei",3);
操作成员变量
ClassdogClazz = Dog.class;
Object o = dogClazz.newInstance();
Field[] fields = dogClazz.getFields();
for(Field f: fields){
System.out.println(f.getName());
}
Field field = dogClazz.getField("name");
field.set(o, "zhangsan");
Field field2 = dogClazz.getDeclaredField("age");
field2.setAccessible(true); //否则不能访问到Dog类中的私有变量
field2.set(o, 3);
调用成员方法
ClassdogClazz = Dog.class;
Object o = dogClazz.newInstance();
Method m = dogClazz.getMethod("bark", new Class[]{Dog.class}); //传入方法名,和参数
m.invoke(o, new Object[]{o}); //调用方法