一、反射
1、概念图片:
2、反射相关的主要API:
java.lang.Class //代表一个类 java.lang.reflect.Method //代表类的方法 java.lang.reflect.Field //代表类的成员变量 java.lang.reflect.Constructor //代表类的构造方法
二、Class类:
1、
2、Class类常用方法
3、实例化Class类对象
/** * 实例化Class类对象的三种方法 * @author 小虞哥哥 * */ public class TestClass { public static void main(String[] args) { Person p=new Person(); Class clazz=p.getClass(); //clazz对象中就含p所属的Person类的所有信息 //前提:若已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高 Class c1=Person.class; //前提:已知某个类的实例,调用该实例的getClass()方法获取Class对象 Class c2=p.getClass(); //前提:已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException try { Class c3=Class.forName("test.Person"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(p.getClass()); } }
4、反射获取一个类的父类和接口
Class clazz=Class.forName("test.Student"); //通过包名.类名的字符串,调用Class.forName方法获取指定类的Class实例 //用反射获取父类和接口 Class superClazz=clazz.getSuperclass(); //获取父类 System.out.println("父类:"+superClazz.getName()); Class[] interfaces=clazz.getInterfaces(); //获取当前类的所有接口 for(Class c:interfaces){ System.out.println("接口:"+c.getName()); }
5、反射获取一个类的构造方法
Class clazz=Class.forName("test.Student"); //通过包名.类名的字符串,调用Class.forName方法获取指定类的Class实例 //反射获取类的构造方法 Constructor[]cons=clazz.getConstructors(); for(Constructor c:cons){ System.out.println("构造方法"+c.getName()); //取得方法名称 //返回数组1代表public 2代表private System.out.println("构造方法"+c.getName()+"的修饰符是:"+c.getModifiers()); //取得方法的修饰符 } Constructor[]cons1=clazz.getDeclaredConstructors(); //获取类的所有构造方法,包括共有和私有 for(Constructor c:cons1){ System.out.println("构造方法"+c.getName()); //取得方法名称 System.out.println("构造方法"+c.getName()+"的修饰符是:"+c.getModifiers()); //取得方法的修饰符 Class[] paramClazz=c.getParameterTypes(); //获取构造方法的参数类型 for(Class pc:paramClazz){ System.out.println("构造方法"+c.getName()+"的参数类型是:"+pc.getName()); //取得方法的参数类型 } }
6、反射创建一个对象
Class clazz=Class.forName("test.Student"); //通过包名.类名的字符串,调用Class.forName方法获取指定类的Class实例 //用反射的构造方法创建对象 Object obj=clazz.newInstance(); //相当于调用Student类的无参公有的构造方法 Student stu=(Student)obj; Constructor c=clazz.getConstructor(String.class); //指定获取一个有参数且为String类型的公有的构造方法 Student stu1=(Student)c.newInstance("第一中学"); //newInstance实例化对象,相当于调用public System.out.println(stu1.school); //通过反射机制,可以强制调用私有的构造方法 Constructor c=clazz.getDeclaredConstructor(String.class,int.class); //指定获取有两个参数的构造方法 c.setAccessible(true); //解除私有的封装 Student stu=(Student)c.newInstance("张三",12);
7、反射机制获取类的方法
Class clazz=Class.forName("test.Student"); //通过包名.类名的字符串,调用Class.forName方法获取指定类的Class实例 //反射机制获取类的全部方法 //Method[] ms=clazz.getMethods(); //获取到类的所有公有的方法 Method[] ms=clazz.getDeclaredMethods(); //获取到类的所有公有私有的方法 for(Method m:ms){ System.out.println("方法名:"+m.getName()); System.out.println("返回值类型:"+m.getReturnType()); System.out.println("修饰符:"+m.getModifiers()); }
三、Java动态代理