JAVA反射机制

JAVA反射机制

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

意义

首先,反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力。

其次,通过反射机制可以让程序创建和控制任何类的对象,无需提前硬编码目标类。

再次,使用反射机制能够在运行时构造一个类的对象、判断一个类所具有的成员变量和方法、调用一个对象的方法。

最后,反射机制是构建框架技术的基础所在,使用反射可以避免将代码写死在框架中。

正是反射有以上的特征,所以它能动态编译和创建对象,极大的激发了编程语言的灵活性,强化了多态的特性,进一步提升了面向对象编程的抽象能力,因而受到编程界的青睐。

原理

反射机制(Reflection)是Java提供的一项较为高级的功能,它提供了一种动态功能,而此功能的体现在于通过反射机制相关的API就可以获取任何Java类的包括属性、方法、构造器、修饰符等信息。元素不必在JVM运行时进行确定,反射可以使得它们在运行时动态地进行创建或调用。反射技术在中间件领域应用得较多。

Class 类

对象照镜子后可以得到的信息:某个类的属性、方法和构造器、某个类到底实现了哪些接口。

对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特

定某个结构(class/interface/enum/annotation/primitive type/void/[])的有关信息。

Class 本身也是一个类

Ø Class 对象只能由系统建立对象

Ø 一个加载的类在 JVM 中只会有一个Class实例

Ø 一个Class对象对应的是一个加载到JVM中的一个.class文件

Ø 每个类的实例都会记得自己是由哪个 Class 实例所生成

Ø 通过Class可以完整地得到一个类中的所有被加载的结构

Ø Class类是Reflection的根源,针对任何你想动态加载、运行的类,唯有先获得相应的

Class对象

Class类中常用方法

static ClassforName(String name) 返回指定类名name的Class对象

Object newInstance() 调用缺省构造函数,返回Class对象的一个实例

getName() 返回此Class对象所表示的实体(类,接口,数组类

或void)的名称。

Class getSuperClass() 返回当前Class对象的父类的Class对象

Class[] getinterfaces() 获取当前Class对象的接口

ClassLoader getClassLoader() 返回该类的类加载器

Constructor[] getConstructors() 返回一个包含某些Constructor对象的数组

Method getMothed(String name,Class… T) 返回一个Method对象,此对象的形参类型为

paramType

Field[] getDeclaredFields() 返回Field对象的一个数组

package Annotaions;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class fanshe {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Class classs=Class.forName("Annotaions.ml");//通过类名获取一个实例化Class类对象
        ml ml = (ml) classs.newInstance();// 该类具体的对象
        Method[] methods = classs.getMethods();//获取ml类的方法名
        for (Method method : methods) {
            System.out.println(method);
        }
        Field[] fields = classs.getDeclaredFields();//获取mL类的成员属性
        for (Field field : fields) {
            System.out.println(field);
        }
        Constructor[] constructors = classs.getConstructors();//获取ml的构造方法
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值