一、反射
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动态代理