反射

来源:互联网 发布:datediff mysql 编辑:程序博客网 时间:2024/06/08 18:21

本文目录

1 Class类

2 反射



1 Class类


1.1 引用方式


1.1.1 Class引用

Class c1= ClassDemo.class;Classc2= Class.forName("demo.cla.ClassDemo");


1.1.2 泛化Class引用

通过泛化可以指定类型,只有满足要求的类型,才可以赋值。

Class<ClassDemo> c1 = ClassDemo.class;Class<? extends ClassDemo> c1 = ClassDemoChild.class;Class<?> c2 = Class.forName("demo.cla.ClassDemo");


1.1.3 引用方式区别

在使用某个类之前,需要一些准备工作,包含三个步骤:

(1)加载:类加载器查找字节码(.class文件)并从中创建一个Class类的对象。

(2)链接:验证字节码,为静态域分配空间。

(3)初始化:执行静态初始化器或静态初始化块。


通过.class方式获得一个Class对象引用时,不会执行初始化步骤。初始化会被延迟到对静态域进行首次引用时才执行。


通过Class.forName(String className)方式获得一个Class对象引用时,会执行初始化步骤。


实际上,Class.forName另一个重载方法,可以指定是否执行初始化步骤,而Class.forName(String className)也是调用这个重载方法并设置执行初始化步骤。


1.2 常用方法

// 获取一个指定类的Class对象Class c = Class.forName(String className);// 获取类的全名(含包名)c.getTypeName();// 获取类的类名(不含包名)c.getSimpleName();// 判断obj对象是否属性指定类型或其子类型,效果相当于 obj instanceof classNamec.isInstance(Object obj);// 将obj对象强制转化为指定类型c.cast(Object obj);// 创建一个指定类的实例对象c.newInstance();// 获取所有构造方法Constructor[] ctors = c.getConstructors();// 获取符合给定参数列表的构造方法Constructor ctor = c.getConstructor(Class…);// 获取所有方法Method[] methods = c.getMethods();// 获取符合给定名称和参数列表的方法Method method = c.getMethod(StringmethodName, Class…);// 获取所有属性Fields[] fields = c.getFields();// 获取指定名称的属性Field field = c.getField(String fieldName);


2 反射


2.1 Constructor

// 获取符合给定参数列表的构造方法Constructor ctor= c.getConstructor(int.class, int.class);// 通过构造方法创建一个对象Object obj = ctor.newInstance(1,2);


2.2 Method

// 获取符合给定名称和参数列表的方法Method method = c.getMethod("show", int.class, int.class);// 通过指定的对象调用当前方法method.invoke(obj, 1, 2);


2.3 Field

// 获取指定名称的属性Field field = c.getField("num1"); // 获取指定的对象的属性(不指定类型)Object valueObj = field.get(obj);// 获取指定的对象的属性(指定类型)Object valueInt = field.getInt(obj); // 设置指定的对象的属性值(不指定类型)field.set(obj, 100);// 设置指定的对象的属性值(指定类型)field.setInt(obj, 200);


原创粉丝点击