Java反射机制解析

首先在反射之前我们要先了解java类的整个加载机制:我们的.java源码文件通过编译之后会生成一个JVM可识别的二进制字节码.class文件,每一个类都会产生一个Class对象,保存在对应的.class字节码文件中,类装载器在会将这些类装载到JVM中。类装载器一般会在类的首次使用时或者一个静态(static)成员引用时,就会触发类加载器动态的将类加载到JVM中(另外JVM预先加载某些类也是被允许的),加载过程中,类的加载器会先在JVM的静态方法区检查一遍这个Class对象时候已经被加载过了,如果没有加载,则默认的加载器就会根据类名查找对应的.class文件,将其读取到jvm中,然后将这个类的信息保存在静态方法区,类的信息包括:类的全限定名、父类的全限定名、字段信息、方法信息、类的访问修饰符等。这是整个类的加载机制

反射与常规区别在于:.class文件里面的信息对于我们来说是未知的,只有加载到JVM的方法区才可以得到这个类的方法、属性等进行调用,也就是说常规时是在编译的时候打开和检查.class文件,而反射则是在运行时打开和检查.class文件,查找类中的方法属性等,所以我们可以于运行时加载、探知、使用编译期间完全未知的class。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。既一种“看透class”的能力

优缺点:优点体现在它的动态编译上,能够运行时确定类型,绑定对象,灵活性高,也降低了类之间的耦合度;缺点在于通过这种方式创建对象一般比较慢,性能较低,同时安全性低,也破坏了java封装的一个思想。

反射的实现:java反射机制的实现要要借助Class、Constructor、Field、Method这四个类;其中class代表的是类对象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象,这些类的对象由JVM在启动时创建;这样的话就可以使用Contructor创建新的对象,用get()和set()方法获取和修改类中与Field对象关联的字段,用invoke()方法调用与Method对象关联的方法。另外,还可以调用getFields()、getMethods()和getConstructors()等许多便利的方法,以返回表示字段、方法、以及构造器对象的数组,这样,对象信息可以在运行时被完全确定下来了。

伪代码:

定义一个学生类

package pers.ly.learn.reflection;

public class Student {
	
	private String name;
	
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Student(String name) {
		super();
		this.name = name;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + "]";
	}

}

测试使用反射方式创建对象:

package pers.ly.learn.reflection;

import java.lang.reflect.InvocationTargetException;

public class Test {
	
	public static void main(String[] args) {
		Student student = null;
		try {
			student = (Student)Class.forName(Student.class.getName()).getConstructor(String.class).newInstance("daa");
		} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
				| NoSuchMethodException | SecurityException | ClassNotFoundException e) {
			e.printStackTrace();
		}
		System.out.println(student);
	}

}

反射的其他应用实例:java的动态代理、Hibernate、mybatis、Spring AOP等后端框架都大量使用到反射原理来实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值