------- android培训、java培训、期待与您交流! ----------
十二、反射
反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示。表示Java类的Class类显然要提供一些列的方法来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,他们是Field、Method、Contructor、Package等等。
12.1、反射机制
使用java的反射机制,一般需要遵循三步:
1、获得你想操作类的Class对象
2、通过第一步获得的Class对象去取得操作类的方法或是属性名
3、操作第二步取得的方法或是属性
Java运行的时候,某个类无论生成多少个对象,他们都会对应同一个Class对象,它表示正在运行程序中的类和接口。如何取得操作类的Class对象,常用的有三种方式:
1、调用Class的静态方法forName,
2、使用类的.class语法,如:Class cls = String.class;
3、调用对象的getClass方法,如:String str = "abc";Class cls = str .getClass();
使用示例:
/**
* Java 反射练习。
*/
public class Test {
public static void main(String[] args) throws Exception {
DisPlay disPlay = new DisPlay();
// 获得Class
Class cls = disPlay.getClass();
// 通过Class获得DisPlay类的show方法
Method method = cls.getMethod("show", String.class);
// 调用show方法
method.invoke(disPlay, "Wanggc");
}
}
class DisPlay {
public void show(String name) {
System.out.println("Hello :" + name);
}
}
Constructor类代表摸个类中的一个构造方法
(1)、得到某个类所有的构造方法
例如:Constructor[] con = Class.forName("java.long.String").getConstructors;
(2)、得到某一个构造方法
例如:Constructor[] con = Class.forName("java.long.String").getConstructor(StringBuffer.class);
注:获得方法时要用到类型
(3)、创建实例对象
例如:
class text
{
public static void main(Sting[] args)
{
Constructor con1 = String.class.getConstructor(StringBuffer.class);
String str = (String)con.newInstance(new StringBuffer("avs"));
System.out.print(str.charAt(2));
}
}
注:调用获得的方法时要用到上面相同类型的实例对象
(4)、Class.newInstance()犯法
例如:String str = (String)Class.forName("java.long.String").newInstance();
注:该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。