如果不知道某个是对象的确切类型,RTTI(通过运行时类型信息)可以告诉我们。但是有限制:这个类型在编译的时候自己要知道。这样我们才能使用RTTI、换句话说:在编译的时候编译器必须知道所有要通过RTTI处理的类。
我们在更大的变成世界中的时候,首先就是“基于构件的编程”,在此种编程中,将使某种基于快速开发应用的构建工具来构建项目。这是一种高可视化编程方法,可通过不同组件的突变拖拽到表单中来创建程序。然后再变成的时候通过设置构件的蜀绣那个来配置他们。这种设计时的配置,要求构件都是可实例化的,并且要暴露部分信息,以允许程序员来读取和设置构件的值。
人们想要在运行的时候来获取类的信息的一个重要方法就是反射机制。
Java反射机制就是在运行状态中,对于任意的一个类,能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用他的任意一个方法和属性,这种动态的获取信息以及动态的调用对象的方法的功能就是Java语言的反射机制。
Java反射机制:程序运行时,允许改变成粗结构或者变量类型,即动态语言。
Java反射机制提供 的主要功能有下:
1.在运行的时候判断任意对象所属类;
2.在运行的时候构造任意一个类的对象;
3.运行的时候判断一个类所具有的成员变量和方法;
4.运行的时候调用任意一个对象的方法;
5.生成动态代理。
1: 得到各个字节码对应的实例对象:
·类名.class 或者 类名.TYPE
·对象.getClass()
·Class.forName("类名")
示例1:
public class Test01{
/**
* 反射机制
* @param args
* @throws ClassNotFoundException
*/
public static void main(String [] args) throws ClassNotFoundException{
// TODO Auto-generated catch block
String str1 = "abc";
Class cls1 = str1.getClass(); //三种获取字节码的方法
Class cls2 = String.class;
Class cls3 = Class.forName("java.lang.String");
System.out.println(cls1 == cls2);
System.out.println(cls2 == cls3);
}
}
2.
通过Field调用成员变量
示例2:
public class Test02{
/**
* 反射机制
* @param args
*/
public static void main(String [] args){
// TODO Auto-generated catch block
ReflectPoint MyRe = new ReflectPoint(3, 6);
Field Myfield = MyRe.getClass().getField( "y");
System. out.println(Myfield.get(MyRe));
}
}
class ReflectPoint {
private int x;
public int y ;
public ReflectPoint(int x, int y)
{
super();
this.x = x;
this.y = y;
}
}
3.数组的反射机制
示例3:使用Array工具类完成
public class Test03{
/**
* 数组反射
* @param args
*/
public static void main(String [] args){
// TODO Auto-generated catch block
String[] str = new String[]{"a" ,"b" ,"c" };
String str1 = "xyz";
printObject(str);
printObject(str1);
}
public static void printObject(Object ob)
{
Class MyClass = ob.getClass();
if(MyClass.isArray())
{
int len = Array.getLength(ob);
for(int i = 0; i < len; i++)
{
System. out.println(Array.get(ob, i));
}
}
else
{
System. out.println(ob);
}
}
}
小结:
Class类中存在以下几个重要的方法:
1.getName()
一个Class对象描述了一个特定类的特定属性,这个方法就是用来返回String形式的类的简要描述
2.newInstance()
这个方法可以根据某个Class对象来产生其对应类的实例。
注意:它调用的是此类的默认构造方法。
例如:
MyObject my1 = new MyObject();
MyObject my2 = my1.getClass().newInstance();
3.getClassLoader()
返回Class对象对应的类加载器。
4.getComponentType()
该方法针对数组对象的Class对象,可以得到该数组的组成元素所对应对象的Class对象。
例如:
int[] array = new int[]{1,2,3};
Class class1 = array.getClass();
Class class2 = class1.getComponentType();
这里得到的class2对象所对应的就是int这个基本类型的Class对象。
5.getSuperClass()
返回子类所对应父类所对应的Class对象。
6.isArray()
判定此Class对象所对应的是否是一个数组对象。
示例1:
//得到某个对象的公共属性
public Object getProperty(Object owner, String fieldName) throws Exception
{
Class ownerClass = owner.getClass();
Field field = ownerClass.getField(fieldName);
Object property = field.get(owner);
return property;
}
示例2:得到某类的静态的公共方法
public Object getStaticProperty(String className, String fieldName)
{
Class ownerClass = Class.forName(className);
Field field = ownerClass.getField(fieldName);
Object property = field.get(ownerClass);
return property;
}
示例3:得到数组中的某个元素
public Object getByArray(Object array, int index)
{
return Array.get(array,index);
}