------- android培训、java培训、期待与您交流! ----------
Java的所有类都有一个与之对应的Class类的对象,用来描述类的属性,如:类名,包名,构造器(Constructor),成员变量(Field),成员方法(Method)……每个Class对象对应一份字节码。
获得某个类的Class对象,有三种方法(以String类为例):
1. String.class;
2. Class.forName(“java.lang.String”);
3. String str = “abc”; str.getClass();
9个预定义的Class对象:
boolean, byte, char, short, int, long, float,double, void
基本类型的包装类封装了常量TYPE保存基本类型的Class对象(字节码)
数组也是一种类型,有对应的Class对象
反射
反射就是把java类中的各种成分映射成相应的java类。
import java.lang.reflect.*;
public class TestClass {
public static void main(String[] args) throws Exception {
A a = new A();
Class cls1 = A.class;
Class cls2 = Class.forName("A");
Class cls3 = a.getClass();
System.out.println(cls1.isPrimitive());//是否是9个基本类型之一
// System.out.println(void.class.isPrimitive());
a = (A)cls1.newInstance();
System.out.println("int[] isArray : " + int[].class.isArray());
String className = cls1.getName();//取得类名
Package pak = cls1.getPackage();//取得类所在的包名
/**
* 构造方法反射
*/
Constructor con = cls1.getConstructor(null);//取得具有指定参数列表的public构造器
Constructor[] cons = cls1.getConstructors();//取得所有public构造器
A b = (A)con.newInstance(null);//通过构造器创建实例对象
/**
* 成员变量反射
*/
Field fld1 = cls1.getField("str1");//取得具有指定名字的public字段
Field fld2 = cls1.getDeclaredField("str4");
fld2.setAccessible(true);
Field[] flds = cls1.getFields();//取得所有public字段
String s = (String)fld2.get(a);
fld1.set(a, "abc");
System.out.println(a.str1);
for(Field field : flds) {
if(field.getType()==String.class) {//getTpe()取得字段的类型
String ss = (String)field.get(a);
ss = ss.replace('a', 'b');
field.set(a, ss);
}
}
System.out.println(a.str1);
/**
* 成员方法反射
*/
Method mhd = cls1.getMethod("f1", null);//取得指定名称和指定参数列表的public方法
Method[] mhds = cls1.getMethods();//取得所有public方法
mhd.invoke(a, null);
}
}
class A {
public String str1 = "aaa";
protected String str2 = "bbb";
String str3 = "ccc";
private String str4 = "ddd";
public A() {
}
public void f1() {
System.out.println("f1 is invoked.");
}
protected void f2() {
}
void f3() {
}
private void f4() {
}
}