Java反射

Java反射

回顾java中如何使用类和对象

1.定义类

2.创建已知类的对象,明确知道要创建哪儿个类的对象new 类名(); 一切都是已知的,对于我们自己写的程序没有任何问题(业务代码) ,但是像框架,tomcat,或者一些其他的组件(Jackson 对象->json),事先不知道具体要处理那些类,只能根据配置文件中配置的类的地址决定要创建那个类.

框架要做到可以处理任何类,只要写一套处理程序即可.框架要做到以不变应万变.

问题:如果只知道类的地址,如何使用类

<select id="findstudent" parameterType="int" resulttype="com.ffyc.mybatis.model.student"> 

框架可以做到给他什么类名,就可以创建给定类的对象,并调用该对象的方法和属性:1.创建对象2.将查询到的结果,封装到创建的对象中(调用setxxx(),调用xxx属性)

<select id="findstudent" parameterType="int" resulttype="com.ffyc.mybatis.model.student"> 

如何实现写一套程序可以处理任何类

答案是:反射机制

反射机制

可以看做是一种反向使用类

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个 类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个 方法和属性;这种动态获取信息以及动态调用对象的方法的功能称为 java语言的反射机制。

在程序运行状态中,可以动态获取类的信息,可以动态创建类的对象,可以调用对象的成员(变量,方法,构造方法)的机制称为java反射机制

1.如何获取类的信息

可以通过获取到类的class对象,然后通过class对象就可以获得类中想要的信息

2.如何获得类的Class对象

方法一: 框架中常用,只知道类的字符串地址

String s="com.ffyc.mybatis.model.student"

Class c1=Class.forName(s);

//把给定地址的类进行了加载,为期创建Class对象,通过Class对象,就可以任意获取到类中的信息

方法二:类名.class 获得类的Class对象

Class c2=Student.class;

方式三:适用的场景:已知对象,需要对任何对象进行操作

Student s=new Student();

Class c3=s.getClass();
//通过已知对象的getClass()获得该对象类的Class对象

3.获取到类的Class对象之后,如何获取类信息并操作对象中的成员?

String s="com.ffyc.mybatis.model.student"

Class c1=Class.forName(s);
object studentboject=c1.newInstance()//通过Class类的对象,创建对象
    
 Constructor cons=c1.getConstructor();//获得类中指定的公共的构造方法 获得无参构造方法封装到一个constructor中
Object objectstudent =constructor.newInstance();//通过构造方法中newInstance()创建对象
Student s=(Student)objectstudent;

1.获取类中的构造方法信息getConstructor()

获得指定(参数个数,类型)的公共构造方法,返回constructor来表示获得到的构造方法

newinstance();创建类的对象

getConstructors() 返回所有公共的构造方法

getDeclaredConstructor()获得指定的构造方法(包含私有,受保护,默认,公共)

getDeclaredConstructors() 获得所有构造方法

2.获得成员变量

public Field getField(String name)通过指定Field名字,返回 Field实例

Field类将类的属性进行封装,可以获得属性的基本信息、属性的值,也 可以对属性进行赋值.

● getName:返回属性的名字

● set:设置属性

3.获得方法

● Method实例都是通过Class类的方法获得

● Method getMethod(String name, Class… parameterTypes) : 通过指定方法名,参数类型,返回一个Method实例

● Method类将类中的方法进行封装,可以动态获得方法的信息,例如

● getName:获得方法名字

● getParameterTypes:获得方法参数类型

● 除了动态获得方法信息外,Method还能动态调用某一个对象的具体方法

● invoke(Object obj, Object… args) :使用obj调用该方法,参数为args

反射优缺点

● 优点:

● 1.增加程序的灵活性,可以在运行的过程中动态对类进行修改和操作

● 2.提高代码的复用率,比如动态代理

● 3.可以在运行时轻松获取任意一个类的方法、属性,并且还能通过反射进行动态 调用

● 缺点:

● 1.反射会涉及到动态类型的解析,导致性能要比非反射调用更低

● 2.使用反射技术通常要在一个没有安全限制的程序运行.

● 3.反射可以绕过一些限制访问的属性或者方法,可能会导致破坏代码本身的抽象 性

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值