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对象
- getClass() 使用情况:通过实例对象对用
Employee e;
Class cl = e.getClass();
- 静态方法Class.forName() 使用情况:类名保存在一个字符串中;
String className = "java.util.R
andom";
Class cl = Class.forName(className);
注意:className要是一个类名或者接口名。否则返回检查型异常
- T.class
Class cl1 = Random.class
Class cl2 = int.class
从这里也可以看出Class是个泛型类
- 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; } }