java反射

java反射

java 反射: 动态加载指定的类,获取该类所有内容(属性,行为特征),并将字解码文件中的内容都封装成对象,这样便于操作这些成员,简单的讲-java反射技术就是对一个类进行解析。

反射步骤:
1、获得Class对象,就是获取到指定的名称的字节码文件对象。

2、实例化对象,获得类的属性、方法或构造函数。

3、访问属性、调用方法、调用构造函数创建对象。

反射的方法:
1:通过每个对象都具备的方法getClass来获取。弊端:必须要创建该类对象,才可以调用getClass方法。

2:每一个数据类型(基本数据类型和引用数据类型)都有一个静态的属性class。弊端:必须要先明确该类。

     前两种方式不利于程序的扩展,因为都需要在程序使用具体的类来完成。

3:使用的Class类中的方法,静态的forName方法。

     指定什么类名,就获取什么类字节码文件对象,这种方式的扩展性最强,只要将类名的字符串传入即可、
// 1. 根据给定的类名来获得 用于类加载

String classname = "cn.itcast.reflect.Person";// 来自配置文件
Class clazz = Class.forName(classname);// 此对象代表Person.class
// 2. 如果拿到了对象,不知道是什么类型 用于获得对象的类型

Object obj = new Person();
Class clazz1 = obj.getClass();// 获得对象具体的类型
// 3. 如果是明确地获得某个类的Class对象 主要用于传参
Class clazz2 = Person.class;    

反射的用法:

1)、需要获得java类的各个组成部分,首先需要获得类的Class对象,获得Class对象的三种方式:

    Class.forName(classname)    用于做类加载
    obj.getClass()                用于获得对象的类型
    类名.class             用于获得指定的类型,传参用


2)、反射类的成员方法:

    Class clazz = Person.class;
    Method method = clazz.getMethod(methodName, new Class[]{paramClazz1, paramClazz2});
    method.invoke();

3)、反射类的构造函数:
    Constructor con = clazz.getConstructor(new Class[]{paramClazz1, paramClazz2,...})
    con.newInstance(params...)

4)、反射类的属性:
    Field field = clazz.getField(fieldName);
    field.setAccessible(true);
    field.setObject(value);


 

猜你喜欢

转载自blog.csdn.net/qq_39479350/article/details/80049266