反射及其应用---->1

目录

1.反射的定义

2.反射的应用

2.1 获得Class对象

2.2 获得类对象

获得类的基本信息


1.反射的定义

  • 程序可以访问、检测和修改它本身状态或行为的一种能力

  • 在程序运行时,可以通过反射了解类的信息 和 使用类

    • 了解类的哪些信息呢?

      • 类的基本信息(类名,修饰符,实现接口,继承的父类,所属的包,使用的注解)

      • 类的构造方法信息 (修饰符,方法名,参数列表,异常声明,注意:没有方法体)

      • 类的属性信息(修饰符,属性类型,属性名)

      • 类的普通方法信息(修饰符,返回类型,方法名,参数列表,异常声明,注意:没有方法体)

    • 如何实用类?

      • 创建对象

      • 调用对象的方法

      • 调用对象的属性

    • 为什么要通过反射了解类信息,要操作类对象?

      • 做封装工具或框架时,会使用的放射

      • 封装中有一部分功能时固定的,有一部分功能需要按照使用者的需求来实现

      • 使用者如何将我们的需求告诉框架,从而让框架按照我们的需求来完成操作

        1. 传参

        2. 配置(文件)

        3. 约定大于配置

      • 如果不同的使用者,有不同的类操作需求,就会应用到反射了。

2.反射的应用

与反射相关的类一般都在 java.lang.reflect包中

2.1 获得Class对象

  • Class对象是反射应用的基石,必须要先获得Class对象,才能完成后续的反射操作

  • 在JVM加载类信息时,会经过一系列的处理,最终将类信息存在方法区,并且为之生成一个Class对象,作用方法区类信息的访问入口

  • 将Class对象理解成类模板

  • 如何获得Class对象? 有三种方式

    1. Class c ="类名".getClass()

      getClass是Object类的方法

    2. Class c = String.class ;

    3. Class c = Class.forName("java.lang.String");

2.2 获得类对象

获得类的基本信息

  • Class可以代表类或接口

  • 提供了一些方法可以获得类的基本信息

c.getName();//获得类长名
c.getSimpleName();//获得类短名
c.getModifiers();//获得修饰符组合的数字和
				 //Modifier.toString( c.getModifiers() ) 获得修饰符关键字
c.getSuperClass();//获得父类
c.getInterfaces();//获得接口数组
c.getPackage();//获得包对象
			   //package.getName() 获得包名
public static void main(String[] args) {
    Class<A> c = A.class;

    System.out.println(c.getName()); //获得类长名(带包路径)
    System.out.println(c.getSimpleName()); //获得类短名

    //访问权限也算修饰符
    //该方法获得的是修饰符组合的数字和
    System.out.println(Modifier.toString(c.getModifiers()));

    Class sc = c.getSuperclass();
    System.out.println(sc.getName()); //java.lang.Object

    Class<?>[] ics = c.getInterfaces();
    for(Class ic : ics){
        System.out.println(ic.getName());//序列化,克隆
    }

    Package p = c.getPackage();
    System.out.println(p.getName());
}

获得属性信息

类的属性信息,都是用Field对象表示

c.getFields();//获得所有属性对象(公共的,从父类继承的)
c.getField(name);//获得指定名字的属性对象
c.getDeclaredFields();//获得本类所有权限的属性对象
c.getDeclaredField(name);
field.getName();//获得属性名
field.getModifiers();//获得属性修饰符
field.getType();//获得属性类型
public static void main(String[] args) throws NoSuchFieldException {
    Class c = A.class ;

    //获得指定名字的属性
    //与getFields方法一同,只能获得public的属性,可以是自己的也可以是继承来的
    Field field = c.getField("n");
    System.out.println(field.getName());
    System.out.println(field.getType());
    System.out.println(Modifier.toString( field.getModifiers() ));

    System.out.println("--------------------------------");
    Field[] fields = c.getFields();
    for(Field f : fields){
        System.out.println(f.getName());
        System.out.println(f.getType());
        System.out.println(Modifier.toString( f.getModifiers() ));
    }

    System.out.println("--------------------------------");

    //与getDeclaredField()一同,可以获得当前类的所有权限的属性,但不能获得继承属性
    fields = c.getDeclaredFields() ;
    for(Field f : fields){
        System.out.println(f.getName());
        System.out.println(f.getType());
        System.out.println(Modifier.toString( f.getModifiers() ));
    }

}

获得方法信息

c.getMethods(); //获得所有的public方法,可以继承的
c.getDeclaredMethods();//获得本类所有权限的方法
c.getMethod(name,Class...paramTypes) ;//根据指定的方法名和参数列表类型获得只当的方法
									  //c.getMethod("t1");   			t1()
									  //c.getMethod("t1",int.class);	t1(int)
									  //c.getMethod("t1",int.class,String.class) t1(i,s)
c.getDeclaredMethod(name , Class...pts) ;
method.getName();//获得方法名
method.getModifiers();
method.getReturnType();//获得返回类型
method.getParameterCount();//获得参数数量
method.getParameterTypes();//获得参数列表类型 返回Class[]
method.getParameters();//获得参数列表对象 返回Parameter[]
					   //parameter.getName();获得参数名
					   //parameter.getType();获得参数类型
					   //parameter.getModifiers();获得参数修饰符
method.getExceptionTypes();//获得异常声明列表
public static void main(String[] args) throws NoSuchMethodException {
    Class c = A.class ;

    //Method t1 = c.getMethod("t1",int.class);
    Method[] ts = c.getMethods() ;
    for(Method t1 : ts) {
        System.out.println(t1.getName()); //方法名
        System.out.println(t1.getReturnType()); //返回类型
        System.out.println(Modifier.toString(t1.getModifiers())); //修饰符
        Parameter[] parameters = t1.getParameters();
        System.out.println(parameters.length); //参数个数
        System.out.println(t1.getParameterCount());
        for (Parameter parameter : parameters) {
            System.out.println(parameter.getName());//参数名(*)
            System.out.println(parameter.getType());//参数类型
            System.out.println(Modifier.toString(parameter.getModifiers()));
        }
        Class<?>[] ets = t1.getExceptionTypes();
        System.out.println(ets.length);//异常个数
        for (Class e : ets) {
            System.out.println(e.getName());
        }
        System.out.println("-------------------------------------");
    }
}

获得构造方法信息

c.getConstructors();//获得所有公共的构造方法(本类和继承的)
c.getConstructor(Class...pts);//根据参数列表类型获得指定的构造方法
c.getDeclaredConstructors();
c.getDeclaredConstructor(Class...pts);
constructor.getName();//获得方法名
constructor.getModifiers();
constructor.getParameterCount();//获得参数数量
constructor.getParameterTypes();//获得参数列表类型 返回Class[]
constructor.getParameters();//获得参数列表对象 返回Parameter[]
					   //parameter.getName();获得参数名
					   //parameter.getType();获得参数类型
					   //parameter.getModifiers();获得参数修饰符
constructor.getExceptionTypes();//获得异常声明列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值