反射是java语言的一个特性,并且反射机制在框架设计中占有举足轻重的作用,因为很多框架中都有反射的影子,那java反射怎么写?下面来我们就来给大家讲解一下这方面的内容。
第一种:通过Object类的getClass方法
@Test public void test01() throws IllegalAccessException, InstantiationException { //new 对象 Date date = new Date(); System.out.println(date); //1.反射第一种方式,用自己找出自己,并创建自己 Date date1 = date.getClass() .newInstance(); System.out.println(date1); System.out.println(date == date1); }
第二种:通过对象实例方法获取对象
@Test public void test02() throws IllegalAccessException, InstantiationException { //第二种:通过对象实例方法获取对象 Class < Date > dateClass = Date.class; System.out.println(dateClass); Date date = dateClass.newInstance(); System.out.println(date); }
第三种:通过Class.forName方式
@Test public void test03() throws IllegalAccessException, InstantiationException, ClassNotFoundException { //反射的第三种方式,用java的class根据类的出处创建对象 Class < Date > aClass = (Class < Date > ) Class.forName("java.util.Date"); Date date = aClass.newInstance(); System.out.println(date); }
对于有空构造函数的类 可以直接用字节码文件获取实例:
Object o = clazz.newInstance(); // 会调用空参构造器 如果没有则会报错
对于没有空的构造函数的类则需要先获取到他的构造对象 在通过该构造方法类获取实例:
Constroctor constroctor = clazz.getConstructor(String. class , int . class ); // 获取构造函数 Object obj = constroctor.newInstance( "jack" , 18 ); // 通过构造器对象的newInstance方法进行对象的初始化
java反射的原理是什么?
1、原理分析
反射的实现利用Class类,在Java中万物都是对象,类也不例外,类本身也是对象,每个类别都是Class类别的对象。
一个类别加载后,在方法区域创建代表该类别的Class类别的对象,该对象保存该类别的所有信息,作为访问该类别的入口。
因此,在运行过程中,如果你想通过发射获取某种类型的信息,首先JVM检查该类型是否已经加载,如果没有,首先加载,然后通过调用相应的Class对象获取该类型的信息。
2、反射过程
准备阶段:编译期间装载所有类别,将各类元信息保存在Class类别对象中,各类对应Class对象。
获得Class对象:调用x.class/x.getClass()/Class.forName()获得x的Class对象clz(这些方法的基础是native方法,在JVM的基础上制作,与JVM的基础有关,首先不进行探索)。
实际反射操作:通过clz对象获得Field/Method/Constructor对象进一步操作。
这就是java反射的原理,反射能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。不过反射会消耗一定的系统资源,如果不需要动态地创建一个对象,那么就不需要用反射。最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。
推荐阅读: