反射是指针对任何一个Class类,在运行的时候都可以直接得到这个类的全部成分。
在运行时,可以直接得到这个类的构造器对象:Constructor
在运行时,可以直接得到这个类的成员变量对象: Field
在运行时,可以直接得到这个类的成员方法对象 :Method
这种运行时动态获取类信息以及调用类中成分的能力称之为java语言的反射机制。
反射的第一步是先得到编译后的Class类对象,然后就可以得到Class的全部成分。
反射是运行时获取类的字节码文件对象,然后可以解析类中的全部成分
获取Class类对象的三种方法:
1 Class C1=Class.forName("全类名")
2 Class c2=类名.class
3 Class c3=对象.getClass()
- package reflect;
-
- public class Test {
-
- public static void main(String[] args)throws Exception {
- //第一种方法
- Class c=Class.forName("reflect.Student");
- System.out.println(c); //输出class reflect.Student
-
- //第二种方法
- Class c1=Student.class;
- System.out.println(c1);//输出class reflect.Student
-
- //第三种方法,通过类对象
- Student s=new Student();
- Class c2=s.getClass();
- System.out.println(c2);//输出class reflect.Student
-
- }
-
- }
第一步:获取Class 对象
第二步: 获取Constructor对象
第三步: 创建对象
Class类中用于获取构造器的方法
Constructor> [] getConstructors() 返回所有构造器对象的数组(只能拿Public修饰的)
Constructor>[] getDeclaredConstructors() 返回所有构造器对象的数组,存在就能拿到
Constructor> getConstructor(Class> parameterTypes) 返回单个构造器(只能拿public修饰的)
Constructor> getDeclaredConstructor(Class> paramterTypes) 返回单个构造器,存在就能拿到
- import java.lang.reflect.Constructor;
-
- public class Test {
- public static void main(String[] args) throws Exception{
- Class c=Teacher.class;//获取类对象
- //拿全部构造器(public修饰的)
- Constructor[] arr=c.getConstructors();
- for (Constructor constructor : arr) {
- System.out.println("构造器名称:"+constructor.getName()+"构造器参数个数:"+constructor.getParameterCount());
-
- }
- System.out.println("----------");
-
- //拿全部构造器,有就拿
- Constructor[] arr2=c.getDeclaredConstructors();
- for (Constructor constructor : arr2) {
- System.out.println("构造器名称:"+constructor.getName()+"构造器参数个数:"+constructor.getParameterCount());
-
- }
- System.out.println("----------");
-
- //拿单个构造器,public修饰的
- Constructor constructor1=c.getConstructor(null);
- System.out.println("构造器名称:"+constructor1.getName()+"构造器参数个数:"+constructor1.getParameterCount());
- System.out.println("----------");
-
- //拿单个构造器,有就可以拿
- Constructor constructor2=c.getDeclaredConstructor(String.class,int.class);
- System.out.println("构造器名称:"+constructor2.getName()+"构造器参数个数:"+constructor2.getParameterCount());
- System.out.println("----------");
- }
-
-
- }
T newinstance(Object initargs) 根据指定构造器创建对象
public void setAccessible(boolean flag) 设置true,表示取消访问检查,使用暴力反射(会破坏封装性)
- import java.lang.reflect.Constructor;
-
- import reflect.Student;
-
- public class Test2 {
-
- public static void main(String[] args) throws Exception {
- Class c=Teacher.class;//获取对象类
- Constructor constructor=c.getDeclaredConstructor(null); //获取老师类的私有构造器
- //私有构造器是不能访问的,但反射可以通过暴力反射
- constructor.setAccessible(true);//开启暴力反射(会破坏封装性)
- Teacher t=(Teacher)constructor.newInstance();
- System.out.println(t); //打印的是默认值
-
- }
-
- }