java Reflection

106 阅读3分钟

java反射(reflection)机制

1.什么反射?

反射是java编程语言的一个特性。

2.反射的作用?

允许正在执行的java程序检查或“内省”自身,并操纵程序的内部属性(父类,本身,接口,变量,方法,构造函数等)。 java本身是一个静态的语言,而反射机制赋予了java伪动态的性质。

1.在运行时分析类的能力;

2.在运行时检查对象,例如,编写一个使用于所有类的toString方法;

3.实现泛型数组操作代码;

4.利用Method对象。

3.反射的用途?

反射的一个实际用途是在JavaBeans中,可以通过构建器工具在其中可视化操作软件组件。该工具使用反射来动态java组件(类)的属性。

4.Class类

在程序运行期间,java运行时系统始终为所有对象维护一个运行时的类型标识。这个信息会跟踪每个对象所属的类(Class)。虚拟机利用运行时类型信息选择要执行的正确的方法。

Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。

Class 没有公共构造方法。Class 对象是在加载类时由Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。

虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。

4.具体用途

1.反射获取Class对象

  1. getClass() 使用情况:通过实例对象对用
Employee e;
Class cl = e.getClass();
  1. 静态方法Class.forName() 使用情况:类名保存在一个字符串中;
String className = "java.util.R
andom";
Class cl = Class.forName(className);

注意:className要是一个类名或者接口名。否则返回检查型异常

  1. T.class
Class cl1 = Random.class
Class cl2 = int.class

从这里也可以看出Class是个泛型类

  1. T.TYPE
Class cl1 = Random.class
Class cl2 = Integer.TYPE

TYPE是Integer中的静态常量

public static void main(String[] args) {
System.out.println(int.class==Integer.TYPE);//结果为true

System.out.println(int.class==Integer.class);//结果为false

}

2.反射获取类名

String getName();

3.初始化新建对象

Object newInstance(Object params) 将params传递到构造器,通过构造器创建新的实例。 特点 1.弱类型,低效率,易回收; 2.必须要类加载后才能执行成功; 3.只能调用无参构造。

Class cl = Class.forName(className);
1.cl.newInstance();
2.cl.getConstructor().newInstance();

4.反射获取Method独享列表

Method[] getMethods() 返回所有公共方法,包括继承来的 Method[] getDeclaredMethods() 返回这个类或者接口的所有方法,不包括继承来的。

5.反射获得构造函数信息

Constructor[] getConstructors() Constructor[] getDeclaredConstructors()

6.反射获得类的数据字段

Field[] getDeclaredFields();

7.实现泛型数组

package reflection;

import java.lang.reflect.Array; import java.util.Arrays;

/**

  • @author wangchuang

  • @Version 8

  • @since 2021 10 2021/10/31 13:20 */ public class CopyOfTest { public static void main(String[] args) { int[] a = {1,2,3}; a = (int[]) goodCopyOf(a, 10); System.out.println(Arrays.toString(a));

     String[] b = {"Tom", "Dick", "Harry"};
     b = (String[]) goodCopyOf(b, 10);
     System.out.println(Arrays.toString(b));
    
     System.out.println("The following call will generate an exception.");
    

// b = (String[]) badCopyOd(b, 10); } public static Object[] badCopyOd(Object[] a, int newLength){ Object[] newArray = new Object[newLength]; System.arraycopy(a, 0, newArray, 0, Math.min(a.length, newLength)); return newArray; } public static Object goodCopyOf(Object a, int newLength){ Class cl = a.getClass(); if(!cl.isArray()) return null; Class componentType = cl.getComponentType(); int length = Array.getLength(a); Object newArray = Array.newInstance(componentType, newLength); System.arraycopy(a, 0, newArray, 0, Math.min(length, newLength)); return newArray; } }