在java中,创建一个新的对象时我们第一个想到的是通过new来创建一个对象,我们不通过new可以新建一个对象吗?还有其他的方法来创建一个新的对象吗?其实是可以的,我们可以通过反射的一个机制来获取类的所有信息,不受权限的控制我们也可以获取一个类的所有信息。相信很多初学java的小伙伴对于反射也很陌生,下面由我来揭秘一下java中的一个内容----反射。
我们了解一个东西首先要了解他的含义再了解他的用法。
什么是反射
反射就是通过某种机制动态获取这个类的所有信息,这里的所有信息是包括类的属性、方法、构造方法等这些信息。而且他的访问是不存在权限这么一说的,就算是私有的类资源都是可以访问到的。
每一个类在类加载的时候都会生成一个Class类的对象,而且这个对象是唯一一个的。我们对这个Class对象进行操作就是我们对反射的使用。
反射的使用
1.得到类的Class对象
Class类是有泛型的我们查看jdk源码就可以知道:
这里得到Class对象有如下三种方法:
1.通过
类名.class
Class<Student> clazz = Student.class;
2.通过
类的对象.getClass()
Student stu = new Student();
//<?extends Student>Student本类,以及他的子类,上界
Class<?extends Student> clazz2 = stu.getClass();
3.通过Class类的static方法:
forName(类的全限定名)
Class <?> clazz3 = Class.forName("com.fs.Student");
2.利用反射新建一个对象
- 利用Class的
newInstance()
方法来新建一个对象,下面是api文档中的newInstance()方法。
这个方法要求类要有他的无参构造方法并且这个无参构造方法必须是要公开的(public),如果没有达到上面两个条件,则不会创建对象成功。
如下面的例子。
Class clazz = Student.class;
Object o = clazz.newlnstance();
2.通过反射得到构造方法来创建对象
Class clazz = Student.class;
//指定参数类型的构造方法
//会产生没有匹配方法的异常 NoSuchMethodException,报<init>表示这个类的构造方法
Constructor c1= class.getConstructor(String.class,String.class);
Object o1 = c1.newInstance(1,"张三");
通过上面的方法我们同时也需要他的访问权限是公开的,也可以获取不公开的构造方法,接着往下看就会明白啦。
3.通过反射获得它的构造方法
这里获得它的构造方法指的是获得它构造方法的一个对象,就是Constructor类的一个对象。我们通过查看api文档可以可以知道他有四个方法返回的是一个Constructor对象,我们可以知道这四个方法得到的是构造器对象。这四个方法如下图:
上面的第一个与第三个方法我们可以看到方法括号里面有参数就可以大致的知道他获得的是带指定参数的构造器,其实他也可以获取无参的构造方法,只要不在括号里面传参数就可以,第二与第四个方法是获取全部的构造方法的对象。第一、二个方法获得的是公开的构造器,私有的构造器是无法获取的,而第三、四个方法获得的构造器是不受权限影响的,可以获取他的私有构造方法。
如下面的例子
//获得所有的构造方法,private修饰的构造不能获得
Constructor[] cons = cls.getConstructors();
for(int i=0;i<cons.length;i++){
System.out.println(cons[i]);
}
//获得本类所有的构造方法,包括private修饰的构造
Constructor[] cons = cls.getDeclaredConstructors();
for(int i=0;i<cons.length;i++){
System.out.println(cons[i]);
}
//得到指定的构造 方法,如果有多个参数,中间用","隔开Constructor con = cls.getDeclaredConstructor(String.class,Integer.class);//也可以使用另一种方式来获得:cls.getConstructor(parameterTypes)
获取属性以及方法与上面获得构造方法的方式大同小异,你们可以根据上面获得它构造方法的过程依葫芦画瓢。
获取属性相关的方法如下:
获取方法相关的方法如下: