JAVA中的反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法。
1、得到类的属性
public Object getProperty(Object owner, String fieldName) throws Exception {
Class ownerClass = owner.getClass(); //得到对象的class
Field field = ownerClass.getField(fieldName); //通过class得到类的属性
Object property = field.get(owner); //通过对象得到该属性的实例。
}
2、得到类的静态属性
public Object getStaticProperty(String className, String fieldName)
throws Exception {
Class ownerClass = Class.forName(className);
Field field = ownerClass.getField(fieldName);
//这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里可以得到
Object property = field.get(ownerClass);
return property;
}
3、执行对象的方法
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
Class ownerClass = owner.getClass();
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName,argsClass); //得到要执行的方法
return method.invoke(owner, args);
}
4、执行某个类的静态方法
public Object invokeStaticMethod(String className, String methodName,
Object[] args) throws Exception {
Class ownerClass = Class.forName(className);
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName,argsClass);
return method.invoke(null, args); //因为是静态方法所以不需要实例
}
5、新建对象
public Object newInstance(String className, Object[] args) throws Exception {
Class newoneClass = Class.forName(className);
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Constructor cons = newoneClass.getConstructor(argsClass);
return cons.newInstance(args); //创建对象
}
知识点总结:
反射的基石-->Class类
java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。
Class对象保存的是某个类的字节码;
得到字节码的三种方式:
1、Class.forname("java.long.String")//反射所用到的获取字节码的方式
2、Object.getClass();
3、Object.class
同一个类的字节码在内存中只存在一份,类的不同的实例用同一份字节码
Class中的一些方法:
ifPrimitive();判断字节码是不是基本的类型
Integer.TYPE为包装类型的基本的字节码
int[].class.isArray();是不是一个数组类型的字节码
.getConstructors();构造方法的反射,返回的是一个Constructor对象数组
.getField("成员变量名")OR .getFields();成员变量的反射,获得的field不是对象上的变量而是类上的
.getMethod("方法的名字",参数类型Object.class);成员方法的反射(Method)
.newInstance();调用不带参数的构造方法
.getConstructor(Object.class);得到有相应参数类型的构造方法,返回的是一个Constructor对象(newInstance(new Object()))
总之,只要是在源程序中出现的类型,都有各自的Class实例对象
反射的定义:反射就是把Java类中的各种成分映射成相应的Java类。