Java基础篇--反射笔记

本文深入解析Java反射机制,探讨其动态获取类信息和调用对象方法的功能,介绍反射在Spring框架IOC原理中的应用,以及如何通过Class类和反射API进行动态编译,提升系统的灵活性和可扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java的反射机制应用广泛,例如很多框架的原理就是反射。

AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。例如在Spring框架中的IOC(控制反转)的原理就是反射。

首先我们先明确两个概念,静态编译和动态编译。
静态编译:在编译时确定类型,绑定对象,即通过。
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多
态的应用,有以降低类之间的藕合性。
我们可以明确的看出动态编译的好处,而反射就是运用了动态编译创建对象。

反射机制提供以下运行时功能:
1、判断对象所属的类
2、创建一个类的对象
3、判断一个类所具有的成员变量和方法
4、调用对象的方法
5、生成动态代理。

反射机制有许多用途,使用反射会极大地提高系统地灵活性和可扩展性。同时,反射也具有性能较低、相对不安全、破坏类地封装性等缺点。

反射的使用
获取类对象:
1、类名.class (int.class double.class)
2、类的对象.getClass()
3、Class.forName(“类的全名” ) 通过类名获得类对象

Class类的常用方法:

方法返回值类型描述
forName(String className)static Class<?>返回与具有指定字符串名称的类或接口关联的Class对象
getName()String 返回类名
getsuperClass()Class<? super T>返回此类的父类名
getClassLoader()ClassLoader返回类的类加载器
getConstructors()Constructor<?>[]返回类的所有公共构造方法
getModifiers()int返回类的修饰符
newInstance()T创建由此Class对象表示的类的新实例
c1.getName();//类对象名
c1.getPackage().getName()//包名
c1.getSuperclass().getName()//父类对象名
Class [] c = c1.getInterfaces();//实现的接口。

java.lang.reflect包下
Field 属性对象
Methd 方法对象
Constructor 构造方法对象

getFields():获得公开属性(包括父类)
getDeclaredFileds():获得所有属性(只包括本类)

Field[] fl = c1.getFields();
for(Field f:fl){
System.out.println(f);
}

getMethods() 获取公开方法
getDeclaredMethods():获取所有方法

Method[] mt = c1.getMethods();
for(Method m:mt){
System.out.println(m);
}

getConstructors():获取公开构造方法
getConstructor():获取无参构造方法
getConstructors(String.class , int .class)获取第一个参数是String类型第二个是int型的构造方法getDeclaredMethods():获取所有构造方法

Constructors[] cs = c1.getContructors();
for(Contructor  c:cs){
System.out.println(c);
}

对比实例

//Object o = new Student();
Class c = class.forName("R.Student");//包名.类名
Object o = c.newInstance(); 


 //Object o2 = new Student("lucy");
 Constructor con = c.getConstructor(String.class)
 object o2 = con.newInstance("lucy");

//o2.study();
Method m = c.getMethod("study");
m.invoke(o2);

//int result = o2.study("math");
Method m2 = c.getMethod("study",String.class);
Object result = m2.invoke(o2, "math");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值