今天学习了关于反射的内容知识,根据反射的原理,我们在写完源代码后第一步先保存.java文件,然后编译成.class文件,当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程称为类加载,在内存中.class文件的存在形式为Class类,在Java中万物皆对象,所以我们要进行反射的一些操作,就要拿到Class类的对象.
在这里我们主要掌握一种:
Class.forName(String s) -->s为路径
在java类中,各种内容大致可以分为
属性 ---> Field
无参构造方法 -->Constructor
有参构造方法 -->Constructor
普通方法 -->Method
而反射针对每一种内容有各自的处理方式
这里涉及到一个面试题:
* 问:如何实现类的实例化?如果不使用new呢?
* 答:两种方法,第一种是直接new来实例,
* 第二种通过反射,拿到Class的对象,再通过Class对象的方法(Object)newInstance() **强制类型转换获取该类的实例
* 注意问题:
1:在操作私有属性或者私有方法时,一般情况下会拒绝访问,通setAccessible(true)方法实现操作权限
* 2:在操作普通方法时,遇到static方法时,在invoke方法中,可以将第一个参数(Obj)设置为null
下面是Java反射机制在操作各种内容的代码:
-
//操作无参构造方法 public static void getConstructor() throws Exception { //获取Class类 Class c1 = Class.forName("pp.Person"); //得到Person类的实例 Person person = (Person) c1.newInstance(); person.setName("haha"); System.out.println(person.getName()); } //操作带参数的构造方法 public static void Test2() throws Exception { Class c2 = Class.forName("pp.Person"); Constructor constructor = c2.getConstructor(String.class, String.class); Person person = (Person) constructor.newInstance("wangwei", "100"); System.out.println(person.getName()+person.getId()); } //操作属性 public static void Test3() throws Exception{ //获取Class类 Class c3 = Class.forName("pp.Person"); //实例化 Person person = (Person) c3.newInstance(); //获取属性name Field field = c3.getDeclaredField("name"); //将private属性设置为可操作的 field.setAccessible(true); //相当于person.setName field.set(person,"nihao"); //相当于person.getName System.out.println(field.get(person)); } //操作普通方法 public static void Test4() throws Exception{ Class c4 = Class.forName("pp.Person"); //实例化 Person person = (Person)c4.newInstance(); //获取方法 Method method = c4.getDeclaredMethod("setName",String.class); //注:如果遇到该方法为静态方法即:static修饰时,invoke中第一个参数可以设置为null method.invoke(null,"lina"); System.out.println(person.getName()); }
最后
-
希望各位在看到博客时遇到问题可以提出来,帮助我进步,谢谢大家!