Java基础(21)反射

二十一.反射

类对象  当虚拟机进行类加载时,会将读进的信息保存类对中并放置在堆里,类对象对应的模板叫做Class

类的对象  以某个类为模板创建出的对象 我们称之为类的对象

一.如何获取一个类对象  需要掌握

1.通过类的对象调用getClass() 方法获取类对象

Student student = new Student();

Class class1=student.getClass();

2.类名.Class的形式获取类对象

Class c=Student.class;

3.通过Class类的静态方法forName()来获取

Class.forName(一个类的全类名/全限定名)

类的全类名/全限定名:从包名写起,写到类名  比如com.baizhi.day1.TestClass

Class forName=Class.forName("day27.Student");

4.类加载的触发条件(触发到初始化阶段)

(1)第一次创建某个类的对象时,会让该类的类加载进行到初始化阶段

(2)第一次通过  类名.静态成员的形式调用静态属性  或  静态方法时,会让该类的类加载进行到初始化阶段

(3)子类类加载时,如果父类没有类加载,会让父类先进行类加载,并进行到类加载的初始化阶段

(4)使用Class.forName()方法来获取类对象时,也会触发该类对象所对应类的类加载

二.类对象的使用  需要熟悉

1.获取一个类的相关信息

(1)获取方法信息

获取一个指定的公开方法

getMethod(String name,Class<?>...paraneterTypes);

name是方法名是字符串,第二个参数是关于方法参数表的描述,每个参数数据类型后都要加上.class

例:

Class<?> c= Class.forName("day27.Student");

Method method=c.getMethod("sleep",int.class,String.class);

System.out.println(method);

获取一个指定的方法

Method getDeclaredMethod(String name,Class<?>...parameterTypes)

获取所有公开方法  包含父类

Method[] getMethods()

获取所有的方法  不含父类的

Method[] getDeclaredMethods()

(2)获取属性信息

获取一个公开属性

Field getField(String name)  name是属性的名字

获取指定的任意属性

Field getDeclaredField(String name)

获取所有公开属性  包含父类

Field[] getFields()

获取所有属性  不包含父类

Field[] getDeclaredFields()

(3)获取构造方法信息

获取公开的构造方法

Constructor<T> getConstructor(Class<?>...parameterTypes)

获取指定的构造方法

Constructor<T> getDeclaredConstructor(Class<?>...parameterTypes)

获取所有公开的构造方法

Constructor<?>[] getConstructors()

获取所有构造方法

Constructor<?>[] getDeclaredConstructors()

2.如何使用获取到的类信息

(1)创建类的对象

a.通过类对象newInstance()方法——使用该类的无参构造创建对象  这个类型一定要有无参构造

Class<?> c=Class.forName("day27.Student");

Student stu=(Studen)c.newInstance();

b.通过获取的构造器对象来创建类的实例——可以灵活的指定使用有参构造还是无参构造

Constructor<?> constructor=c.getConstructor(String.class,double.class,int .class);

Student stu=(Student)constructor.newInstance("zzz",10.0,15);

(2)调用类的方法

使用Method对象的

Object invoke(Object obj,Object...args)哪个对象执行该方法,填入的参数

Method method=c.getMethod("study",String.class);

method.invoke(stu,"Java");

(3)能给某个对象的属性赋值

使用Field对象的

void set(Object obj,Object value) 给哪个对象的  这个属性进行赋值

Field field=c.getField("name");

field.set(stu,"zzz");

(4)甚至这些操作可以忽视所有修饰符

在使用属性对象或方法对象时,如果他们是私有的则需要先调用其void setAccessible(true)

属性对象 方法对象  构造方法对象均有 setAccessible方法用来忽视修饰符

Field field=c.getDeclaredField("age");

//忽视修饰符

field.setAccessible(true);

field.setInt(stu,2);

System.out.println(stu); 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值