Java的反射机制应用广泛,例如很多框架的原理就是反射。
AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。例如在Spring框架中的IOC(控制反转)的原理就是反射。
首先我们先明确两个概念,静态编译和动态编译。
静态编译:在编译时确定类型,绑定对象,即通过。
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多
态的应用,有以降低类之间的藕合性。
我们可以明确的看出动态编译的好处,而反射就是运用了动态编译创建对象。
反射机制提供以下运行时功能:
1、判断对象所属的类
2、创建一个类的对象
3、判断一个类所具有的成员变量和方法
4、调用对象的方法
5、生成动态代理。
反射机制有许多用途,使用反射会极大地提高系统地灵活性和可扩展性。同时,反射也具有性能较低、相对不安全、破坏类地封装性等缺点。
反射的使用
获取类对象:
1、类名.class (int.class double.class)
2、类的对象.getClass()
3、Class.forName(“类的全名” ) 通过类名获得类对象
Class类的常用方法:
方法 | 返回值类型 | 描述 |
forName(String className) | static Class<?> | 返回与具有指定字符串名称的类或接口关联的Class对象 |
getName() | String | 返回类名 |
getsuperClass() | Class<? super T> | 返回此类的父类名 |
getClassLoader() | ClassLoader | 返回类的类加载器 |
getConstructors() | Constructor<?>[] | 返回类的所有公共构造方法 |
getModifiers() | int | 返回类的修饰符 |
newInstance() | T | 创建由此Class对象表示的类的新实例 |
c1.getName();//类对象名
c1.getPackage().getName()//包名
c1.getSuperclass().getName()//父类对象名
Class [] c = c1.getInterfaces();//实现的接口。
java.lang.reflect包下
Field 属性对象
Methd 方法对象
Constructor 构造方法对象
getFields():获得公开属性(包括父类)
getDeclaredFileds():获得所有属性(只包括本类)
Field[] fl = c1.getFields();
for(Field f:fl){
System.out.println(f);
}
getMethods() 获取公开方法
getDeclaredMethods():获取所有方法
Method[] mt = c1.getMethods();
for(Method m:mt){
System.out.println(m);
}
getConstructors():获取公开构造方法
getConstructor():获取无参构造方法
getConstructors(String.class , int .class)获取第一个参数是String类型第二个是int型的构造方法getDeclaredMethods():获取所有构造方法
Constructors[] cs = c1.getContructors();
for(Contructor c:cs){
System.out.println(c);
}
对比实例
//Object o = new Student();
Class c = class.forName("R.Student");//包名.类名
Object o = c.newInstance();
//Object o2 = new Student("lucy");
Constructor con = c.getConstructor(String.class)
object o2 = con.newInstance("lucy");
//o2.study();
Method m = c.getMethod("study");
m.invoke(o2);
//int result = o2.study("math");
Method m2 = c.getMethod("study",String.class);
Object result = m2.invoke(o2, "math");