反射机制
JAVA有着一个非常突出的动态相关机制:反射。JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
反射使用
获取Class实例
获取Class实例有三种方法可以获取。实际上前两种方法也带有了包名,类实例getName方法就可以获得。第三种方法的好处,用字符串拼写指定任意包名路径,灵活性强。比如从xml文件获取的包名字符串。
Class<?> cls = Apple.class
Class<?> cls = new Apple().getClass();
Class<?> cls = Class.forName("com.xxx.Apple"); //推荐
cls.getName();//com.xxx.Apple
实例化对象
有了Class实例就可以快乐地玩耍。所有属性和方法都在Class实例里面,还有实例化对象。
Apple apple = (Apple) cls.newInstance();
实例化对象就是这么简单,但只是调用无参构造函数。想要调用有参构造函数。就要调用Class实例的getConstructors方法获取所有构造器。要注意的是只能获取非私有的构造器,同样的调用非私有的构造器会抛异常。
Constructor<?>[] constructors = cls.getConstructors();
for(Constructor<?> cons : constructors){
Class<?>[] params = cons.getParameterTypes();//获取构造器中的参数类型
}
apple = (Apple) constructors[1].newInstance(new Color());//public Apple(Color c)
apple = (Apple) constructors[2].newInstance("apple");//public Apple(String name)
反射字段
获取字段也很简单。调用Class实例的getDeclaredFields方法获取本类字段,也可以调用getFields方法获取父类或接口的字段。调用字段只要找到相应的属性名,然后通过set方法传入对象和值就好了。要注意的是私有字段要setAccessible为true。
Field[] fields = cls.getDeclaredFields();//获取字段
for (Field f : fields) {
String m = Modifier.toString(f.getModifiers());//获取字段修饰符
f.getType();//获取字段类型
f.getName();//获取字段名
}
//反射字段调用
Object obj = cls.newInstance();
Field field = cls.getDeclaredField("name");
field.setAccessible(true);//修改私有字段必须设置true
field.set(obj, "apple");
System.out.println(field.get(obj));
反射方法
反射方法跟反射字段都差不多。
Method[] methods = cls.getMethods();
for (Method m : methods) {
m.getReturnType();//获取方法返回类型
m.getParameterTypes();//获取方法参数类型
String mod = Modifier.toString(m.getModifiers());//获取方法修饰符
m.getExceptionTypes();//获取方法异常
}
//反射方法调用
Object obj = cls.newInstance();
//获取私有的private void setName(String name)
Method method = cls.getDeclaredMethod("setName", String.class);
method.setAccessible(true);//允许修改私有
method.invoke(obj, "apple");//调用方法
//获取公共无参printName方法
method= cls.getDeclaredMethod("printName");
method.invoke(obj);//调用方法
反射应用
反射机制使代码在运行时灵活获取信息。用的范围也很多。比如上面说的读取文件创建对象,动态工厂模式创建对象,运行时强行修改私有值,改变数组大小等等,有时间可以专门再写一篇。不懂点反射机制都不敢说自己是学Java的。本章就到这里,不足之处望指教。