反射机制

反射机制

  • 反射机制:用于动态创建对象并且动态调用方法的机制

1. Class类

1.1 基本概念
  • java.lang.Class类的实例可以用于描述Java应用程序中的类和接口,也就是一种数据类型
  • 该类没有公共构造方法,该类的实例由Java虚拟机和类加载器自动构造完成,本质上就是加载到内存中的运行时类
2.2 获取Class对象的方式(掌握)
  1. 使用数据类型.class的方式可以获取对应类型的Class对象(掌握)
        Class c1 = String.class;
        System.out.println("c1 = " + c1); // 自动调用toString方法  class java.lang.String
        c1 = int.class;
        System.out.println("c1 = " + c1); // int
        c1 = void.class;
        System.out.println("c1 = " + c1); // void
  1. 使用**Class.forName()**的方式来获取参数指定类型的Class对象(掌握)。
        //c1 = Class.forName("String"); // Error  要求写完整的名称:包名.类名
        c1 = Class.forName("java.lang.String");
        System.out.println("c1 = " + c1); // class java.lang.String

        c1 = Class.forName("java.util.Date");
        System.out.println("c1 = " + c1); // class java.util.Date

        //c1 = Class.forName("int");
        //System.out.println("c1 = " + c1); // 不能获取基本数据类型的Class对象
  1. 使用引用/对象.getClass()的方式可以获取对应类型的Class对象。
 		 String s1="s22";
       LocalDateTime localDateTime=LocalDateTime.now();
   	c1=s1.getClass();//class java.lang.String
   	c1=localDateTime.getClass();//class java.time.LocalDateTime
  1. 用包装类.TYPE的方式可以获取对应基本数据类型的Class对象。
        Integer integer=1;
        c1=integer.getClass();
        System.out.println(c1);//class java.lang.Integer
        c1=Integer.TYPE;
        System.out.println(c1);//int
2.3 常用的方法(掌握)
方法声明功能介绍
static Class<?> forName(String className)用于获取参数指定类型对应的Class对象并返回
T newInstance() -----已过时用于创建该Class对象所表示类的新实例
       Class c1=Class.forName(s);//com.lagou.task20.Person
       System.out.println("无参构造:"+c1.newInstance());  // Person{name='null', age=0}

2. Constructor类

2.1 基本概念
  • ​ java.lang.reflect.Constructor类主要用于描述获取到的构造方法信息
2.2 Class类的常用方法(掌握)
方法声明功能介绍
Constructor getConstructor(Class<?>… parameterTypes)用于获取此Class对象所表示类型中参数(Class类型)指定的公共构造方法
Constructor<?>[] getConstructors()用于获取此Class对象所表示类型中所有的公共构造方法
     //使用反射机制以有参方式构造Person类型的对象并打印
		Constructor constructor = c1.getConstructor();
        System.out.println("使用constructor方法构造对象:"+constructor.newInstance());

        Constructor constructor1 = c1.getConstructor(String.class,int.class);
//newInstance方法中的实参是用于给有参构造方法的形参进行初始化的,也就是给name和age进行初始化的
        System.out.println("构造有参对象:"+constructor1.newInstance("zhangfei",88));
2.3 Constructor类的常用方法
方法声明功能介绍
T newInstance(Object… initargs)使用此Constructor对象描述的构造方法来构造Class对象代表类型的新实例
int getModifiers()获取方法的访问修饰符
String getName()获取方法的名称
Class<?>[] getParameterTypes()获取方法所有参数的类型
      	//获取Class对象的所有构造方法
		Constructor[] constructors = c1.getConstructors();
        for (Constructor cs:constructors) {
            System.out.println(cs.getModifiers());//1
            System.out.println(cs.getName());//com.lagou.task20.Person
            Class[] parameterTypes = cs.getParameterTypes();
            for (Class c: parameterTypes) {
                System.out.print(c);//class java.lang.String + int
            }
        }

3. Field类

3.1 基本概念
  • ​ java.lang.reflect.Field类主要用于描述获取到的单个成员变量信息。
3.2 Class类的常用方法
方法声明功能介绍
Field getDeclaredField(String name)用于获取此Class对象所表示类中参数指定的单个成员变量信息
Field[] getDeclaredFields()用于获取此Class对象所表示类中所有成员变量信息
3.3 Field类的常用方法
方法声明功能介绍
Object get(Object obj)获取参数对象obj中此Field对象所表示成员变量的数值
void set(Object obj, Object value)将参数对象obj中此Field对象表示成员变量的数值修改为参数 value的数值
void setAccessible(boolean flag)当实参传递true时,取消 Java 语言访问检查
int getModifiers()获取成员变量的访问修饰符
Class<?> getType()获取成员变量的数据类型
Class<?> getType()获取成员变量的数据类型
        //1 获取Class对象
        Class c1 = Class.forName("com.lagou.task20.Person");
        //2 根据Class对象得到相应的构造方法
        Constructor constructor = c1.getConstructor(String.class, int.class);
        //3 使用构造方法得到Person类型的对象
        Object o = constructor.newInstance("vvv", 111);
        //4 根据Class对象获取相应的成员信息
        Field field = c1.getDeclaredField("name");
        //取消java语言访问权限检查的 暴力反射
        field.setAccessible(true);
        System.out.println(field.get(o));
        //修改对象o中名字为filed成员变量
        field.set(o,"xxx");
        System.out.println(field.get(o));
		// 5.获取Class对象对应类中所有的成员变量
        Field[] fields = c1.getDeclaredFields();
        for ( Field f:fields) {
            System.out.println(f.getModifiers()+ " "+f.getType()+" "+f.getName());
        }

4. Method类

4.1 基本概念
  • java.lang.reflect.Method类主要用于描述获取到的单个成员方法信息.
4.2 Class类的常用方法
方法声明功能介绍
Method getMethod(String name, Class<?>… parameterTypes)用于获取该Class对象表示类中名字为name参数为 parameterTypes的指定公共成员方法
Method[] getMethods()用于获取该Class对象表示类中所有公共成员方法
4.3 Method类的常用方法
方法声明功能介绍
Object invoke (Object obj, Object… args)使用对象obj来调用此Method对象所表示的成员方法,实参传递args
int getModifiers()获取方法的访问修饰符
Class<?> getReturnType()获取方法的返回值类型
String getName()获取方法的名称
Class<?>[] getParameterTypes()获取方法所有参数的类型
Class<?>[] getExceptionTypes()获取方法的异常信息
单个:
		Method method = c1.getMethod("getName");
        System.out.println(method.invoke(o));//启动方法
多个:
        Method[] methods = c1.getMethods();
        for (Method ms:methods) {
            System.out.println("方法修饰符是:"+ms.getModifiers());
            System.out.println("方法返回值类型是:"+ms.getReturnType());
            System.out.println("方法的名称是:"+ms.getName());
            System.out.println("方法形参列表的类型是:");
            Class<?>[] parameterTypes = ms.getParameterTypes();
            for (Class ct : parameterTypes) {
                System.out.print(ct + " ");
            }
            System.out.println("方法的异常类型列表是:");
            Class<?>[] exceptionTypes = ms.getExceptionTypes();
            for (Class ct: exceptionTypes) {
                System.out.print(ct + " ");
            }

4. 获取其他结构信息

方法声明功能介绍
Package getPackage()获取所在的包信息
Class<? super T> getSuperclass()获取继承的父类信息
Class<?>[] getInterfaces()获取实现的所有接口
Annotation[] getAnnotations()获取注解信息
Type[] getGenericInterfaces()获取泛型信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值