很多东西的实现基础,都是反射,spring的AOP,动态代理等等,下面咱们来学习一下Java的反射
什么是反射?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
反射可以做什么?
反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理。
java有哪些反射类?
java.lang.Class;
java.lang.reflect.Constructor; java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
java如何实现反射?
通过反射实例化一个类的对象
public class reflecetTest { public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException { Class<?> test = null; test=Class.forName("com.reflect.Test.Person"); //第一种方法,实例化默认构造方法,调用set赋值 Person person= (Person) test.newInstance(); person.setName("小明"); person.setAddress("建国路"); //第二种方法,取得全部的构造函数,使用构造函数赋值 Constructor<?> constructor[]=test.getConstructors(); //查看每个构造方法需要的参数 for (int i = 0;i<constructor.length;i++){ Class<?> clazzs[]=constructor[i].getParameterTypes(); System.out.println("constructor["+i+"]("); if (clazzs.length > 0){ for (int j=0; j<clazzs.length;j++){ if (j == clazzs.length -1 ) System.out.println(clazzs[j].getName()); else System.out.println(clazzs[j].getName()+","); } } System.out.print(")"); } // person = (Person) constructor[0].newInstance("张三"); System.out.println(person); } }
取得一个类的全部属性
public class ReflectTest implements Serializable{ public static void main(String[] args) throws ClassNotFoundException { Class<?> clazz = Class.forName("com.reflect.Test.Person"); System.out.println("===========本类属性============="); Field[] fields = clazz.getDeclaredFields(); for (int i =0; i<fields.length;i++){ //权限修饰符 int meth = fields[i].getModifiers(); String priv = Modifier.toString(meth); //属性类型 Class<?> type = fields[i].getType(); System.out.println(priv +" "+type.getName() + " " + fields[i].getName() + ";"); } System.out.println("=======实现的接口或者父类的属性========="); //取得实现的接口或者父类的属性 Field[] fields1=clazz.getFields(); for (int j = 0; j<fields1.length; j++){ //权限修饰符 int meth = fields1[j].getModifiers(); String priv = Modifier.toString(meth); //属性类型 Class<?> type = fields1[j].getType(); System.out.println(priv + " " +type.getName() + " "+fields1[j].getName() + ";"); } } }