java面试基础-Java中的反射机制

1)概念:

是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

2)功能:

 在运行时判断任意一个对象所属的类;
 在运行时构造任意一个类的对象;
 在运行时判断任意一个类所具有的成员变量和方法;
 在运行时调用任意一个对象的方法;

 生成动态代理。

3)获得某个对象的具体属性:

Class ownerClass = owner.getClass():得到对象owner的Class。
Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。
Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。如果需要访问到对象的private属性,需要首先调用:AccesibleObject.setAccessible(Field名字,true);
如果说是获取Class的静态属性:则第三句换成Object property=field.get(Class名字),而不是用实例的名字。

4)执行某个对象的方法:

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 = args.getClass();
      }
      Method method = ownerClass.getMethod(methodName, argsClass);
      return method.invoke(owner, args);
}

如果是执行某个类的静态方法: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 = args.getClass();
     }
     Constructor cons = newoneClass.getConstructor(argsClass)return cons.newInstance(args);
 }

这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。

6)判断是否为某个class的实例:

public boolean isInstance(Object obj, Class cls) {
     return cls.isInstance(obj);
}

7)Reflection与introspection

Reflection这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods1。
这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。

你可能感兴趣的:(java基础,java,面试,java反射,java反射机制,语言)