反射
JAVA
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java
语言的反射机制。
- 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是
Class类
中的方法.所以先要获取到每一个字节码文件对应的Class
类型的对象.
反射就是把java
类中的各种成分映射成一个个的Java对象
- 例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
反射机制有什么用?
- 运行时动态获取类的信息:在编写代码时,对于类的信息是必须在编译时确定的,但在运行时,有时需要根据某些条件,动态获取某个类的信息,这时就可以使用Java中的反射机制。
- 动态生成对象:反射机制可以在运行时生成对象,这样就可以根据参数的不同,动态的创建不同的类的实例对象。
- 动态调用方法:通过反射机制可以调用类中的方法,不论这些方法是否是公共的,也不论这些方法的参数个数和类型是什么,反射机制都具有这样的能力。
- 动态修改属性:利用反射机制可以获取到类中的所有成员变量,并可以对其进行修改。
- 实现动态代理:利用反射机制可以实现代理模式,通过代理对象完成原对象对某些方法的调用,同时也可以在这些方法的调用前后做一些额外的处理。
Java反射机制的优点
- 增加灵活性和扩展性:使用反射机制可以在程序运行时动态加载、修改、创建、调用类和方法等,从而增加了程序的灵活性和可扩展性。
- 提高代码的通用性:通过反射机制可以动态的获取类信息,从而可以编写通用的代码,使得不同的类能够以相同的方式来处理。
- 规范代码结构:反射机制可以使代码结构清晰明了,减少了代码中的冗余部分。
- 实现框架和插件:反射机制在很多框架和插件中都有广泛的应用,比如Spring框架、JUnit测试框架等。
- 动态代理:反射机制的另一个重要应用是实现动态代理,可以在不修改原来代码的情况下,通过代理对象对原对象的方法进行增强。
package Chapter09;
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier;
public class Reflect_01 { public static void main(String[] args) throws Exception {
User user = new Child(); user.test1();
Class<? extends User> aClass = user.getClass();
System.out.println(aClass.getName()); System.out.println(aClass.getSimpleName()); System.out.println(aClass.getPackageName());
Class<?> superclass = aClass.getSuperclass(); System.out.println(superclass);
Class<?>[] interfaces = aClass.getInterfaces(); System.out.println(interfaces.length);
Field f = aClass.getField("xxxxx"); Field f1 = aClass.getDeclaredField("xxxxx");
Field[] fields = aClass.getFields(); Field[] declaredFields = aClass.getDeclaredFields();
Method method = aClass.getMethod("test2"); Method xxxx = aClass.getDeclaredMethod("xxxx");
Method[] methods = aClass.getMethods(); Method[] declaredMethods = aClass.getDeclaredMethods();
Constructor<? extends User> constructor = aClass.getConstructor(); Constructor<?>[] constructors = aClass.getConstructors(); aClass.getDeclaredConstructor();
int modifiers = aClass.getModifiers(); boolean aPrivate = Modifier.isPrivate(modifiers); } }
class User { public void test1() { System.out.println("test1..."); } } class Child extends User { public void test2() { System.out.println("test2..."); } }
|
小测试:
package Chapter09;
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;
public class Reflect_02 { public static void main(String[] args) throws Exception {
Class empClass = Emp.class; Constructor declaredConstructor = empClass.getDeclaredConstructor(); Object emp = declaredConstructor.newInstance();
Field account = empClass.getField("account"); Field password = empClass.getField("password");
account.set(emp, "admin"); password.set(emp, "admin");
Method login = empClass.getMethod("login");
Object result = login.invoke(emp);
System.out.println(result); } }
class Emp { public String account; public String password;
public boolean login() { if ( "admin".equals(account) && "admin".equals(password) ) { return true; } else { return false; } } }
|