Java学习:反射
创始人
2024-02-19 08:42:10

reflect

    • 一、反射概述
    • 二、反射API
    • 三、实例

一、反射概述

在运行状态中,对任意一个类,都能知道这个类的所有属性和方法,对任意一个对象,都能调用它的任意一个方法和属性。这种能动态获取信息及动态调用对象方法的功能称为java语言的反射机制

从Oracle的官方文档来看,反射主要应用在以下几方面:

  • 反射让开发人员可以通过外部类的全部路径名创建这些类,并使用这些类,实现一些扩展的功能
  • 反射让开发人员可以枚举出类的全部成员,包括构造函数、属性、方法。以帮助开发者写出正确的代码
  • 测试时可以利用反射API访问类的私有成员,以保证测试代码覆盖率

二、反射API

反射API用途
Field类提供有关类的属性信息,以及对它的动态访问权限。它是一个封装反射类的属性的类
Constructor类提供有关类的构造方法的信息,以及对它的动态访问权限。它是一个封装反射类的构造方法的类
Method类提供有关类的方法的信息,包括抽象方法。它是用来封装反射类方法的一个类
Class类表示正在运行的Java应用程序中的类的实例
Object类Object是所有Java类的父类。所有对象都默认实现了Object类的方法

三、实例

package Reflect;public class User {private int id;public String name;public User(int id,String name){this.id = id;this.name = name;}public int add(int number){this.id += number;return id;}
}

1、获取class对象

package Reflect;import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class reflect {public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, ClassNotFoundException {//获取class对象//1、通过完整路径名获取class对象Class clazz = Class.forName("Reflect.User");//2、通过类的class属性获取Class clazz1 = User.class;//3、通过对象来获取,这种方式已经获取了对象不需要再使用反射User zhangsan = new User(1,"yangguang");Class clazz2 = zhangsan.getClass();}
}

2、通过反射来访问成员变量和私有成员变量

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class reflect {public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, ClassNotFoundException {//获取class对象//1、通过完整路径名获取class对象Class clazz = Class.forName("Reflect.User");//2、通过类的class属性获取Class clazz1 = User.class;//3、通过对象来获取,这种方式已经获取了对象不需要再使用反射User zhangsan = new User(1,"yangguang");Class clazz2 = zhangsan.getClass();//通过反射来访问成员变量,name是public的Field idfield = clazz.getField("name");System.out.println(idfield.get(zhangsan));//这时候可能有人会说,已经通过zhangsan创建了对象,直接用System.out.println(zhangsan.name);不就可以把成员变量打印出来,为什么要多此一举用反射?//其实通过反射还可以访问类的私有成员变量,通过getDeclareField方法Field field = clazz.getDeclaredField("id");field.setAccessible(true);System.out.println(field.get(zhangsan));}
}

3、通过反射来调用方法

package Reflect;import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class reflect {public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, ClassNotFoundException {//获取class对象//1、通过完整路径名获取class对象Class clazz = Class.forName("Reflect.User");//2、通过类的class属性获取Class clazz1 = User.class;//3、通过对象来获取,这种方式已经获取了对象不需要再使用反射User zhangsan = new User(1,"杨广");Class clazz2 = zhangsan.getClass();//通过反射来调用方法,如果是私有方法用getDeclareMethodMethod method = clazz.getMethod("add",int.class);System.out.println(method.invoke(zhangsan,100));}
}

4、获取构造方法,创建实例

package Reflect;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class reflect {public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, ClassNotFoundException, InstantiationException {//获取class对象//1、通过完整路径名获取class对象Class clazz = Class.forName("Reflect.User");//2、通过类的class属性获取Class clazz1 = User.class;//获取构造方法,传入构造方法的两个参数类型,若是私有构造方法,则用getDeclareConstructorConstructor constructor = clazz.getConstructor(int.class,String.class);//创建实例Object zhangsan = constructor.newInstance(1,"杨坚");Field field = clazz.getField("name");System.out.println(field.get(zhangsan));}
}

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...