java反射

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

@java反射


java反射概述


一,什么是反射

- 1,反射(Reflection)机制是java语言特性之一,是java被视为动态(或准动态)语言的一个关键特性。
- 2,在计算机领域,反射指一种能力,能够描述和自控制,即在运行状态中,动态获取类信息即动态调用实例方法的能力
- 3,java反射有以下3个动态特性:
A,运行时创建实例
B,运行时调用方法
B,运行时调用方法
C,运行时更改属性
- 4,java反射机制则允许程序在运行时再加载,探知,使用那些在编译时完全未知的类。例如在之前JDBC使用的Class.forName()方法。
- 5,反射机制允许java程序加载一个运行时才得知其名的类,获悉其完整的API信息,包括其修饰符(诸如public,static等),超类,实现的接口, 也包括属性和方法的所有信息;并可生成其实例,对其属性赋值或调用其方法。
- 6,通过java反射可以实现以下功能:
A,在运行时探知任意一个实例所属的类
B,在运行时构造任意一个类的实例
C,在运行时探知任意一个类所具有的方法和属性
D,在运行时调用任意一个实例的方法
- 7,反射使程序可以看清一个类的情况并加以使用。java反射机制能够探知类的基本结构,这种对java类结构探知的能力,称为java自审。并且反射机制是构建框架技术的基础所在。

二,java反射常用API

- 1,使用java反射技术,常用的类如下:
A,java.lang.Class类:反射的核心类,反射所有的操作都是围绕该类来生成的。通过Class类可以获取类的属性,方法,等内容信息。
B,java.lang.reflect.Constructor类:表示类的构造方法。
C,java.lang.reflect.Field类:表示类的属性,可以获取和设置类中属性的值。
D,java.lang.reflect.Method类:表示类的方法,可以用来获取类中方法的信息或执行方法。
- 2,在java程序中使用反射的基本步骤:
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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值