定义
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
用途
在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。当然,也不是所有的都适合反射,之前就遇到一个案例,通过反射得到的结果与预期不符。阅读源码发现,经过层层调用后在最终返回结果的地方对应用的权限进行了校验,对于没有权限的应用返回值是没有意义的缺省值,否则返回实际值起到保护用户的隐私目的。
一、java反射
1、反射:动态获取类的信息,以及动态调用对象的方法的功能。可以理解为动态看透类的能力。
2、主要功能:
①在运行时判断任意一个对象所属的类;
②在运行时构造任意一个类的对象;
③在运行时判断任意一个类所具有的成员变量和方法;
④在运行时调用任意一个对象的方法;
⑤生成动态代理。
通过java反射机制,可以在程序中访问已经装载到JVM中的java对象的描述,实现访问、检测和修改描述java对象本身信息的功能。java反射机制的功能十分强大,java.lang.reflect包中提供了对该功能的支持。
3.Java中反射机制是指在程序运行时,通过提前获取类的信息,动态地操作类和对象的机制。主要有以下三个关键类:Class类、Constructor类、Method类。其中:
1. Class类:表示类类型的类,提供了获取类信息的方法,如获取类名、获取方法等。
2. Constructor类:表示类的构造方法,提供了实例化类的方法,如获取构造方法、创建实例等。
3. Method类:表示类的方法,提供了调用方法的方法,如获取方法、执行方法等。
反射机制的主要作用有:动态地创建对象,动态地获取类信息,动态地调用方法等。但是,由于反射机制在运行时动态地操作对象,所以会带来一定的性能损耗,同时也容易破坏程序的封装性,所以在使用反射机制时需要慎重考虑。
二.使用
-
创建BookServiceimpl类和成员变量,构造方法,成员方法
-
package com.lu.service.impl; import com.lu.dao.BookDao; import com.lu.dao.impl.BookDaoimpl; import com.lu.service.BookService; public class BookServiceimpl implements BookService { //类的属性 public String name; int age; protected String sex; private String address; public BookServiceimpl() { } public BookServiceimpl(String name) { this.name = name; } //类的构造方法 public BookServiceimpl(String name, int age, String sex, String address) { this.name = name; this.age = age; this.sex = sex; this.address = address; } BookDao bookDao = new BookDaoimpl(); @Override public void add() { bookDao.add(); } }
-
测试方法
-
package com.lu.test; import com.lu.service.impl.BookServiceimpl; import java.lang.reflect.Field; public class test01 { public static void main(String[] args) throws Exception { //全类名加载class对象 Class cla = Class.forName("com.xue.service.impl.BookServiceimpl"); //class对象去做类的手术刀,解刨类里边的东西 Field[] fields = cla.getFields(); for (Field field : fields) { System.out.println(field); } System.out.println("-----获取全部内容---------还是单独可以获取到的公共内容------"); Field[] fields1 = cla.getDeclaredFields(); for (Field field : fields1) { System.out.println(field); } BookServiceimpl b1 = new BookServiceimpl(); //根据name获取公共的成员方法 Field name = cla.getDeclaredField("name"); System.out.println(name); //根据age获取成员方法(可以获取到被所有修饰符修饰的成员变量) Field age = cla.getDeclaredField("age"); System.out.println(age); } }
-
使用.properties配置对应方法
-