Java反射

反射reflect,面向对象的变成思想

类 从很多对象中抽取出来的公有的特征行为 抽象描述 用来描述一组对象

对象 现实生活中 先存在了好多对象 很多相同特征 相同行为

类是用来描述一组对象

反射机制认为是用来描述一组类

可以与之前学习File对比着学习

Class 用来描述类本身

Package 用来描述类所属的包

Field 用来描述类中的属性

Method 用来描述类中的方法

Constructor 用来描述类中的构造方法

Annotation 用来描述类中的注解

如何获取Class

通过获取类直接操作类里面的东西

如下三种方式

Class clazz = Class.forName("包名.类名");//需要抛出异常 创建文件自带的src不写包名 java.lang.String

Class clazz = 类名.class; //String.class

Class clazz = 对象.getClass();//Object类中的方法

Class中的常用方法

        1.int result = getModifiers(); 获取类的修饰符(权限 特征)

        如果两个修饰符都有 返回的是两个修饰符代表整数之和

        每一个修饰符 用一个整数来进行表示

        0开始---0 1 2 4 8 16 32 64 128 256 512

        0--默认不写 1--public 2--private 4--protected

        8--static 16--final 32--synchronized 64--volatile

        128--transient 256--native 512--interface 1024--abstract

        2.String name = getName();获取名字(包名+类名)

        3.String simpleName = getSimpleName();简单名(类名)

        4.Package p = getPackage();

        p.getName();//获取包名

        5.Class sclazz = getSuperClass();//获取超类(父类)

        6.Class[] classes = getInterfaces();//当前所有classes的所有父类接口

        查看ArrayList中所有父类的接口

        Class c=ArrayList.class;//获取ArrayList的类

        Class[] clazz=c.getInterfaces();//调用方法 最后遍历输出


        7.Object obj = newInstance();//默认调用无参数构造方法创建对象

        Person p=(Person)obj;//需要造型

        若类中不存在无参数的构造方法 抛出异常NoSuchMethodException

        8.Field f = getField("属性名");

        Field[] fs = getFields();

        如上的两个方法只能获取公有的属性 但是包含继承过来的父类属性

        9.getDeclaredField("属性名");

        Field[] fs = getDeclaredFields();

        如上的两个方法能获取公有的和私有的属性 但是只能获取本类中的属性

        10.Class[] =getClasses(); 获取类中的内部类

Field类中的常用方法

int = getModifers()//获取属性的修饰符

Class = getType()//获取属性的类型

String = getName()//获取属性的名字

操作属性 向里面存值

set(对象,值)

操作属性 从里面取值

值 = get(对象) 需要造型 获取到的get对象的属性是什么参数类型是造成什么类型的

//得到的是当前属性的值

setAccessable(true); //没有进行设置这个就不能修改私有属性的值 也不能通过get直接得到私有属性的值

直接修改私有属性会出现一个异常 illegalAccessException

如何操作类中的方法

Class类中的方法

Method m = class.getMethod("方法名",Class...参数类型);//参数类型.class 获取公有的方法(自己类+父类)

Method[] = clazz.getMethods(); 获取所有的方法(公有 自己+父类)

Method = getDeclaredMethod("方法名字",参数类型的class...) 获取一个方法(自己类 公有 私有)

Method[] = getDeclaredMethods(); 获取全部的方法(自己类 公有 私有)

若方法是私有的方法 不允许操作

可以设置setAccessable(true) 设置方法使用权 准入

获取构造方法

Constructor = clazz.getConstructor(Class...参数类型)//参数类型.class

Constructor[] cons = clazz.getConstructors();

clazz.getDeclaredConstructor();

clazz.getDeclaredConstructors();

Method类中的常用

int mm = m.getModifiers();//获取方法的修饰符(权限+特征)

Class mrt = m.getReturnType();//获取返回值数据类型

String mn = m.getName();//获取方法的名字

Class[] mpts = m.getParameterTypes();//获取方法参数列表的类型

Class[] mets = m.getExceptionTypes();//获取方法抛出异常的类型

Parameter[] parameters = m.getParameters();//获取方法参数列表 如何操作方法

调用方法 让他执行一次

Object result = invoke(对象,执行方法需要传递的所有参数...);

//如果方法没有参数就不写,如果参数类型是String类型就在里面传一个字符串类型的

Constructor类中的常用方法

con.getModifiers();

con.getName();

con.getParameterTypes();

con.getExceptionTypes();

如何操作构造方法

执行一次 创建对象

Object = con.newInstance(执行构造方法时的所有参数);

con.setAccessible(true); //操作私有的构造方法

  • 29
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值