反射应用

版权声明:原创内容是本人学习总结,仅限学习使用,禁止用于其他用途。如有错误和不足,欢迎评论指正补充。 https://blog.csdn.net/qian_qian_123/article/details/82181655

链接:反射概述

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);

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

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

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

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

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

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

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

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

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

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

返回值 方法 说明
Field getField(String name)

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

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

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

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

。。。。。。

      e、访问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对象可以对属性进行取值或赋值操作。

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

4、访问类的方法

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

返回值 方法 说明
Object invoke(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()",就可以执行指定包下,指定类中的指定方法

猜你喜欢

转载自blog.csdn.net/qian_qian_123/article/details/82181655