黑马程序员-Java中的反射

来源:互联网 发布:用源码搭建网站教程 编辑:程序博客网 时间:2024/04/28 08:33

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类。




0 0