java反射怎么写?java反射的原理是什么?

阳光 2022-04-28 17:03:25 java常见问答 7977

反射是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工具网。

推荐阅读:

java接口可以创建对象吗?java接口如何实现?

如何查看json文件?怎么创建json文件?

qt如何添加界面图片不显示?Qt怎么添加图片?