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工具网。
推荐阅读: