提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
@java反射
java反射概述
一,什么是反射
- 1,反射(Reflection)机制是java语言特性之一,是java被视为动态(或准动态)语言的一个关键特性。- 2,在计算机领域,反射指一种能力,能够描述和自控制,即在运行状态中,动态获取类信息即动态调用实例方法的能力
- 3,java反射有以下3个动态特性:
- A,运行时创建实例
- B,运行时调用方法
- B,运行时调用方法
- C,运行时更改属性
- 5,反射机制允许java程序加载一个运行时才得知其名的类,获悉其完整的API信息,包括其修饰符(诸如public,static等),超类,实现的接口, 也包括属性和方法的所有信息;并可生成其实例,对其属性赋值或调用其方法。
- 6,通过java反射可以实现以下功能:
- A,在运行时探知任意一个实例所属的类
- B,在运行时构造任意一个类的实例
- C,在运行时探知任意一个类所具有的方法和属性
- D,在运行时调用任意一个实例的方法
二,java反射常用API
- 1,使用java反射技术,常用的类如下:- A,java.lang.Class类:反射的核心类,反射所有的操作都是围绕该类来生成的。通过Class类可以获取类的属性,方法,等内容信息。
- B,java.lang.reflect.Constructor类:表示类的构造方法。
- C,java.lang.reflect.Field类:表示类的属性,可以获取和设置类中属性的值。
- D,java.lang.reflect.Method类:表示类的方法,可以用来获取类中方法的信息或执行方法。
- A,导入java.lang.reflect包中的相关类。
- B,获的需要操作的类的Class实例。
- C,调用Class实例的方法获取Field,Method等实例。
- D,使用反射API操作实例成员。
二、使用步骤
1.引入库
代码如下(示例):
import java.lang.Class;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
## 2.获取Class实例
1,调用类或接口实例的getClass()方法
getClass()方法是java.lang.Object类中的一个方法,所有类的实例都可以调用该方法,该方法回返回实例的所属类型所对应的Class实例。
代码如下(示例):
Object obj = new Object();
Class class = obj.getClass();
2,调用类或接口的class属性
在某些类或接口没有实例或无法创建实例的情况下,可以通过其class属性获取所对应的Class实例。这种方法需要在编译期酒知道类或接口的名称。
代码如下(示例):
Class class = Student.class;
3,使用Class.forName()方法
若编码时无法确认具体类型,需要程序在运行时根据情况灵活加载,可以使用Class类的forName()方法。该方法是静态方法,需要传入字符串参数,该字符串的值是某个类的完全限定名,即包含包名的完整类名。
代码如下(示例):
Class class = Class.forName("com.mysql.cj.jdbc.Driver");
从Class实例获取信息
1,以字符串形式返回该类型的名称
代码如下(示例):
String name = obj.getName();
2,以字符串形式返回该类型的简称
代码如下(示例):
String name = obj.getSimpleName();
3,获取该类所在的包
代码如下(示例):
Package package = obj.getPackage();
4,返回该类型的超类的Class实例
代码如下(示例):
Class super = obj.getSuperclass();
5,返回该类所实现的全部接口的class实例
代码如下(示例):
Class[] array = obj.getInterfaces();
6,返回该类型的所有修饰符,由public,protected,private ,final,staic,abstract等对应的int常量组成,返回的整数应用Modifer工具类解码,才可以判断修饰符的构成。
代码如下(示例):
int num = obj.getModifers();
7,返回该类型中包含的全部内部的Class实例
代码如下(示例):
Class[] array = obj.getDeclaredClasses();
8,返回该类所在的外部类的Class实例
代码如下(示例):
Class[] array = obj.getDeclaredClass();
Class对象功能:
一,获取功能:
1.获取成员变量们
代码如下(示例):
Field[] fields = clas.getFields() \\获取所有public修饰的成员变量
Field field = clas.getField(string name) \\获取指定名称的 public修饰的成员变量
Field[] fields = clas.getDeclaredFields() \\获取所有的成员变量,不考虑修饰符
Field field = clas.getDeclaredField(String name) \\获取指定名称变量,不考虑修饰符
成员变量操作:
代码如下(示例):
void set(object obj, object value); //1.设置值
Object get(object obj); //2.获取值
clas.setAccessible(true); //3.忽略访问权限修饰符的安全检查
2.获取构造方法们
代码如下(示例):
Constructor<T>[] constructors = clas.getConstructors() \\获取所有public修饰的构造方法
Constructor<T> constructor = clas.getConstructor(类<T>... parameterTypes) \\获取指定变量顺序的 public修饰的构造方法
Constructor<T> constructor = clas.getDeclaredConstructor(类<T>... parameterTypes) \\获取所有的构造方法,不考虑修饰符
Constructor<T>[] constructors = clas.getDeclaredConstructors() \\获取指定变量顺序的构造方法,不考虑修饰符
构造方法操作:
代码如下(示例):
//创建对象:
//1,方法
Class clas = Class.forName("reflect.entity.Person"); \\获取Class实例
Constructor<T> constructor = clas.getConstructor(String.class) \\获取指定变量顺序的 public修饰的构造方法
Object obj = constructor.newInstance("New Person"); \\创建实例
//2,方法:如果使用没有参数的构造方法创建对对象,操作可以简化: Class对象的newInstance方法
Class clas = Class.forName("reflect.entity.Person"); \\获取Class实例
Object obj = clas.newInstance(); \\创建实例
3.获取成员方法们:
代码如下(示例):
Method[] methods = clas.getMethods() \\获取所有public修饰的成员方法
Method method = clas.getMethod(String name, 类<T>... parameterTypes) \\获取指定名称的 public修饰的成员方法
Method[] methods = clas.getDeclaredMethods() \\获取所有的成员方法,不考虑修饰符
Method methods = clas.getDeclaredMethod(String name, 类<T>... parameterTypes) \\获取指定名称变量,不考虑修饰符
成员方法操作:
代码如下(示例):
//执行方法:
Class clas = Class.forName("reflect.entity.Person"); //获取Class实例
Person person = (Person)constructor.newInstance("New Person"); //创建实例
Method method = clas.getMethod(String name, 类<T>... parameterTypes); //获取方法对象
Object obj = method.invoke(person,object...args); //执行方法对象
Method method = clas.getMethod(String name, 类<T>... parameterTypes); //获取方法对象
Object obj = method.invoke(person); //执行方法对象
Array类的部分常用方法
1,创建元素类型为componentType,长度为length的数组
代码如下(示例):
static Object newInstance(Class componentType,int length);
2,创建多维数组,元素类型是componentType,维数是dimensions.length,dimensions中的每一个元素决定每一维的长度
代码如下(示例):
static Object newInstance(Class componentType,int dimensions);
3,返回数组arr的长度
代码如下(示例):
static int getLength(Object arr);
4,xxx表示8种基本数据类型之一,以基本数据类型返回数组arr中索引为index的元素
代码如下(示例):
static xxxgetXxx(Object arr,int index);
5,以Object类型返回数组arr中索引为index的元素
代码如下(示例):
static Object get(Object arr,int index);
6,将val赋给数组arr中索引为index的元素,xxx为8种的基本数据类型之一
代码如下(示例):
static void setXxx(Object arr,int index,xxx val);
7,将val赋值给数组arr中索引为index的元素
代码如下(示例):
static void set(Object arr,int index,Object val);
8,示例:
代码如下(示例):
//创建一个元素类型为String,长度为10的数组
Object arr = Array.newInstance(String.class,10);
//为数组arr中index为5的元素赋值
Array.set(arr,5,"Jack");
//取出数组arr中index为5的元素的值
Object o = Array.get(att,5);
总结
提示:这里对文章进行总结:
总结:一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。@TOC