Java基础技术之反射详解

2023-08-06 0 2,231

目录

一、反射是什么?

反射,指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对任意一个对象,都能调用它的任意一个方法。这种动态获取信息,以及动态调用对象方法的功能,叫做java语言的反射机制。反射很强大,有优点也有缺点。

  • 优点:灵活性高。因为反射属于动态编译,即只有到运行时才动态创建 &获取对象实例。
  • 缺点:执行效率低

元数据(metadata):元数据是指用来描述类的数据,就是class的代码数据。所有的class文件加载到虚拟机之后都会被构建成class对象,class对象描述了一个类都有哪些东西,大家都知道的实现的接口,继承的抽象类,成员变量,类变量,成员方法,类方法,静态方法等,这个class对象就是元数据。

  • Class类:代表一个类。
  • Field类:代表类的成员变量(成员变量也称为类的属性)。
  • Method类:代表类的方法。
  • Constructor类:代表类的构造方法。

二、反射常用API

基础

package cn.yx.zg.反射.demo3;
public class Person {
	private String name;
	private int age;
	public Person() {
		super();
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return \"Person [name=\" + name + \", age=\" + age + \"]\";
	}
	public void eat() {
		System.out.println(\"调用无参方法\");
	}
	public void eat(int num) {
		System.out.println(\"调用有参方法\");
	}
}

1、获取Class的三种方式

public static void main(String[] args) throws Exception {
	Class<Person> clazz1 = (Class<Person>) Class.forName(\"cn.yx.zg.反射.demo3.Person\");
	Class clazz2 = Person.class;
	Person p = new Person();
	Class clazz3 = p.getClass();
	System.out.println(clazz1 == clazz2);//true
	System.out.println(clazz2 == clazz3);//true
	//常用的方式
	try {
	   Class npcClazz3 = Class.forName(\"com.反射机制.demo1.Person\");
	  } catch (ClassNotFoundException e) {
	     e.printStackTrace();
	 }
 }

2、newInstance方法获得对象

Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的构造函数, 就不能这样创建了,可以调用Class类的getConstructor (String.class,int.class)方法获取一个指定的构造函数然后再调用

public static void main(String[] args) throws Exception {
        Class clazz = Class.forName(\"cn.yx.zg.反射.demo3.Person\");
        //通过无参构造创建对象
        Person p = (Person) clazz.newInstance();
        System.out.println(p);
        //通过构造方法参数创建对象
        Constructor c = clazz.getConstructor(String.class,int.class);	//获取有参构造
        Person p2 = (Person) c.newInstance(\"张三\",23);						//通过有参构造创建对象
        System.out.println(p2);
    }

3、Field方法操作字段。动态给字段设置值,获取值

Class.getField(String)方法可以获取类中的指定字段(可见的), 如果是私有的可以用getDeclaedField(“name”)方法获取,通过set(obj, “李四”)方法可以设置指定对象上该字段的值, 如果是私有的需要先调用setAccessible(true)设置访问权限,用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值

public static void main(String[] args) throws Exception {
   Class clazz = Class.forName(\"cn.yx.zg.反射.demo3.Person\");
   Constructor c = clazz.getConstructor(String.class, int.class);    //获取有参构造
   Person p = (Person) c.newInstance(\"张刚\", 2);                        //通过有参构造创建对象
   //Field f = clazz.getField(\"name\");								//获取姓名字段
   //f.set(p, \"李四\");												//修改姓名的值
   Field f = clazz.getDeclaredField(\"name\");                 //如果name字段是private权限 暴力反射获取字段
   f.setAccessible(true);                                          //去除私有权限
   f.set(p, \"李四\");
   //name字段的类型
   Class<?> type = f.getType();
   System.out.println(type);
   System.out.println(p);
    }

4、invoke方法 动态调用指定方法

Class.getMethod(String, Class…) 和Class.getDeclaredMethod(String, Class…)方法可以获取类中的指定方法,调用invoke(Object, Object…)可以调用该方法

 public static void main(String[] args) throws Exception {
  Class clazz = Class.forName(\"cn.yx.zg.反射.demo3.Person\");
  Constructor c = clazz.getConstructor(String.class, int.class);    //获取有参构造
  Person p = (Person) c.newInstance(\"张三\", 23);                        //通过有参构造创建对象
  Method m = clazz.getMethod(\"eat\");                                //获取eat方法
  m.invoke(p);
  Method m2 = clazz.getMethod(\"eat\", int.class);                    //获取有参的eat方法
  m2.invoke(p, 10);
 }

三、总结

反射机制是很多Java框架的基石!!!读框架源码,里面很多都用到反射技术,平常写通用的工具类,也离不开反射。

资源下载此资源下载价格为1小猪币,终身VIP免费,请先
由于本站资源来源于互联网,以研究交流为目的,所有仅供大家参考、学习,不存在任何商业目的与商业用途,如资源存在BUG以及其他任何问题,请自行解决,本站不提供技术服务! 由于资源为虚拟可复制性,下载后不予退积分和退款,谢谢您的支持!如遇到失效或错误的下载链接请联系客服QQ:442469558

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 Java教程 Java基础技术之反射详解 http://www.20zxx.cn/806512/xuexijiaocheng/javajc.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务