java反射怎么创建?java反射如何使用?

阳光 2022-05-05 15:30:00 java常见问答 7421

Java 反射机制在服务器程序和中间件程序中得到了广泛运用,在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有属性和方法。那java反射怎么创建?下面来我们就来给大家讲解一下。

我们先准备一个类,就叫People吧。

public class People
{
    undefined
    private long id;
    private int age;
    private int sex;
    private String name;
}

第一种方式:通过实例化对象的getClass()方法实现反射

People p = new People();
Class class1 = p.getClass();
String name1 = class1.getName();

第二种方式:通过类路径实现反射

try
{
    undefined
    Class class2 = Class.forName("org.example.People");
    String name2 = class2.getName();
}
catch (ClassNotFoundException e)
{
    undefined
    e.printStackTrace();
}

注意,Class.forName是会抛出ClassNotFoundException,一定要捕获处理。

第三种方式:通过类名实现反射

Class class3 = People.class;
String name3 = class3.getName();

java反射如何使用?

要想使用反射,必须先得到代表的字节码的Class对象,Class类用于表示.class文件(字节码)

1.通过该类的对象去获取到对应的Class对象(基本不用它)

//第一种方式: student--->Class对象  通过getClass()方法
//Student是一个空类
Student student = new Student();
//这里我们就省去泛型了,Class<?>
Class stuClass = student.getClass(); //获取到了对应的Class对象
System.out.println(stuClass);
System.out.println(stuClass.getName()); //获取Class对象的名字
输出:
class fanshe.Student
fanshe.Student

但是需要注意的是,第一种我们基本不用,这里显然和反射机制相悖(你有类对象 student 还去用反射获取Class类对象干嘛,多此一举)

2.通过类名.class静态属性获取(比较简单)

//第二种方式:  每个类创建后 都会有一个默认的静态的class属性 用于返回该类的class对象
//需要注意的是:  任何数据类型(包括基本数据类型)都有“静态”的class属性
Class stuClass2 = Student.class;
System.out.println("是否为同一个class对象?" + (stuClass == stuClass2));

结果:true

这里需要注意的是,这种方式虽然比较简单,但是需要导包,不然会编译错误(对比第三种,全限定类名方式)

3.通过Class类中的静态方法 forName()方法获取(最为常见)

//第三种方式:  Class.forName("fanshe.Student");  注意参数一定为该类的全限定类名
try
{
    Class stuClass3 = Class.forName("fanshe.Student");
    //System.out.println(stuClass3); 输出仍然是class fanshe.Student
    System.out.println("是否为同一个class对象?" + (stuClass3 == stuClass2));
}
catch (ClassNotFoundException e)
{
    e.printStackTrace();
}

结果:true

结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。

Java反射能够提高系统的灵活性和扩展性,可以与Java动态编译相结合,可以实现无比强大的功能,但是java反射也有一定的弊端,因此大家在使用时还是要谨慎一些!最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。

推荐阅读:

qt如何添加资源文件?qt怎么新建项目?

JAVA写程序如何输出前五十个素数?如何判断一个数是否是素数?

java内存泄漏原因有哪些?java内存泄漏原因及解决方法