您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 |

自学教程:Java基础技术之反射详解

51自学网 2023-07-22 10:36:25
  python
这篇教程Java基础技术之反射详解写得很实用,希望能帮到您。

一、反射是什么?

反射,指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对任意一个对象,都能调用它的任意一个方法。这种动态获取信息,以及动态调用对象方法的功能,叫做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框架的基石!!!读框架源码,里面很多都用到反射技术,平常写通用的工具类,也离不开反射。

到此这篇关于Java基础技术之反射详解的文章就介绍到这了,更多相关Java反射内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


python动态加载技术解析
Python中Pandas库的数据处理与分析
51自学网自学EXCEL、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。
京ICP备13026421号-1