反射应用

链接:反射概述

1、获取类的信息

  1.1、获取Class对象

      a、调用对象的getClass()方法;

Student stu=new Student();
Class clazz=stu.getClass();

      b、调用类的class属性;

Class clazz=String.class;

      c、使用Class类的forName()方法

Class clazz=Class.forName("cn.zhangwendi.day7.Student");   //(类名+包名)
//throws ClassNotFoundException

  1.2、从Class对象获取信息

      a、访问Class对应的类所包含的构造方法(Constructor);

返回值方法说明
ConstructorgetConstruct(Class[ ] params)

返回此Class对象所表示的类的指定的public构造方法。构造方法的参数类型与params所指定的参数类型相匹配。

例:Constructor con=clazz.getConstruct(String.class,int.class)

Constructor[ ]getConstructs()返回所有public构造方法。
ConstructorgetDeclaredConstruct(Class[ ] params)返回指定的构造方法,与访问级别无关。
Constructor[ ]getDeclaredConstructs()返回所有的构造方法,与访问级别无关。

      b、访问Class对应的类所包含的方法(Method);

返回值方法说明
MethodgetMethod(String name,Class[ ] params)

返回此Class对象所表示的类的指定的public方法。name参数用于指定方法名称,params参数是按声明顺序标志该方法参数类型的Class对象的一个数组。

例:Method meth=clazz.getMethod(name,String.class);

Method[ ]getMethods()返回所有public方法。
MethodgetDeclaredMethod(String name,Class[ ] params)返回指定的方法,与访问级别无关。
Method[ ]getDeclaredMethods()返回所有的方法,与访问级别无关。

      c、访问Class对应的类所包含的属性(Field);

返回值方法说明
FieldgetField(String name)

返回此Class对象所表示的类的指定的public属性。name参数用于指定方法名称

例:Field field=clazz.getField(age);

Field[ ]getFields()返回所有public属性。
FieldgetDeclaredField(String name,Class[ ] params)返回指定的属性,与访问级别无关。
Field[ ]getDeclaredFields()返回所有的属性,与访问级别无关。

      d、访问Class对应的类所包含的注解(Annotation)

返回值方法说明
<A extends Annotation>A getAnnotation(Class<A> annotationClass)试图获取该Class对象所表示类上指定类型的注释,如果该类型的注释不存在则返回null。其中annotationClass参数对应于注释类型的Class对象。
Annotation[ ]getAnnotations()返回此元素上存在的所有注释
Annotation[ ]getDeclaredAnnotations()返回直接存在于此元素上存在的所有注释

      e、访问Class对应的类的其他信息

返回值方法说明
Class[ ]getDeclaredClasses()返回该Class对象所对应类里包含的全部的内部类
Class[ ]getDeclaringClass()返回该Class对应的类所在的外部类
Class[ ]getInterfaces()返回该Class对象对应类所实现的全部接口
intgetModifiers()返回此类或接口的所有修饰符,返回的修饰符public、protected、private、final、static和abstract等对应的常量组成,返回的整数应使用Modifer工具类的方法来解码,才可以获取真实的修饰符。
PackagegetPackage()获取此类的包
StringgetName()以字符串形式返回此Class对象所表示的类的名称(包名+类名)
StringgetSimpleName()以字符串形式返回此Class对象所表示的类的简称(类名)
ClassgetSuperClass()返回该Class所表示的类的超类对应的Class对象

2、创建对象

通过反射来创建对象有如下两种方式:

  a、使用Class对象newInstance方法创建对象;(实质是上利用默认构造方法来创建该类的实例)

Class clazz =Date.class;

Date date=(Date)clazz.newInstance();//需要抛出异常。(throws InstantiationException, IllegalAccessException )

  b、使用Constructor对象创建对象(可以使用指定的构造方法来创建实例)

Class clazz = Student.class;
Constructor con=clazz.getConstructor(String.class,int.class);//throws NoSuchMethodException, SecurityException 

Student stu=(Student)con.newInstance("張大仙",18);
/*throws InstantiationException,IllegalAccessException,IllegalArgumentException, InvocationTargetException */

3、访问类的属性

  使用Field对象可以获取对象的属性。通过Field对象可以对属性进行取值或赋值操作。

 返回值方法说明
voidsetAccessible(boolean flag)对获取到的属性设置访问权限。参数为TRUE,可以对私有属性取值和赋值。
voidset(Object obj,Xxx val)将val赋值给obj
voidset(Object obj,Object val)将val赋值给obj
ObjectgetXxx(Object obj) 
Objectget(Object obj) 

4、访问类的方法

  使用Method对象可以调用对象的方法

返回值方法说明
Objectinvoke(Object obj,Object...args)obj是执行该方法的对象,args是执行该方法时传入的该方法的参数。

5、使用Array类动态创建和访问数组

在java.lang.reflect包下还提供了一个Array类,Array类的对象可以代表所有的数组。程序可以通过使用Array类来动态的创建数组,操作数组元素等。

import java.lang.reflect.Array;

public class Test {

	public static void main(String[] args) {
		Object arr=Array.newInstance(String.class, 10);
		Array.set(arr, 0, "zhang");
		Array.set(arr, 1, "zhao");
		Array.set(arr, 2, "wang");
		
		Object o0=Array.get(arr, 0);
		Object o1=Array.get(arr, 1);
		Object o2=Array.get(arr, 2);
		
		System.out.println(o0);
		System.out.println(o1);
		System.out.println(o2);
	}

}

 

 

小练习:

1、使用反射,遍历某个类的所有的构造方法,属性,方法,打印到控制台
2、    // 需求说明  // 定义Student类,包含:姓名和年龄等属性,有参和无参构造方法,输出所有信息的方法  // 使用多种方法生成一个Student类的Class对象  // 使用Class类获取Student类的结构信息并输出  // 通过有参(无参)构造方法动态创建Student类的对象  // 使用反射修改和查询Student类的姓名属性  // 使用反射动态执行Student类输出所有信息的方法

3、写一个类Test2类, 类中写一个静态方法Object methodInvoker(String classMethd),此classMethod为无参方法名如, 我们传入的实参字符串为:classMethod 为"java.lang.String.length()",就可以通过反射执行String类中的length方法、 当传入的实参字符串为"com.atguigu.javase.reflect.Teacher.test()",就可以执行指定包下,指定类中的指定方法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值