1、获取类对象:
1) Animal animal = new Animal();
Class c1 = animal.getClass();
System.out.println("getClass:" + c1.getName());
2) Class c2 = Animal.class;
System.out.println("class:" + c2);
3) Class c3 = Class.forName("reflect.Animal");
System.out.println("forName:" + c3);
====================
构造方法:
//1.加载Class对象
Class clazz = Class.forName("fanshe.Student");
//2.获取所有公有构造方法
System.out.println("**********************所有公有构造方法*********************************");
Constructor[] conArray = clazz.getConstructors();
for(Constructor c : conArray){
System.out.println(c);
}
System.out.println("************所有的构造方法(包括:私有、受保护、默认、公有)***************");
conArray = clazz.getDeclaredConstructors();
for(Constructor c : conArray){
System.out.println(c);
}
System.out.println("*****************获取公有、无参的构造方法*******************************");
Constructor con = clazz.getConstructor(null);
//1>、因为是无参的构造方法所以类型是一个null,不写也可以:这里需要的是一个参数的类型,切记是类型
//2>、返回的是描述这个无参构造函数的类对象。
成员变量:
1.批量的:
Field[] getFields():获取所有的"公有字段" *
Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;
2.获取单个的:
public Field getField(String fieldName):获取某个"公有的"字段
public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)
成员方法:
1.批量的:
public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)
public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)
2.获取单个的:
public Method getMethod(String name,Class<?>... parameterTypes):
public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
反射方法的其它使用之---通过反射越过泛型检查:
泛型用在编译期,编译过后泛型擦除(消失掉)。所以是可以通过反射越过泛型检查的
ArrayList<String> strList = new ArrayList<String>();
Class listClass = strList.getClass();
Method m = listClass.getMethod("add", Object.class);
m.invoke(strList, 100);
----------------------------------------------------------------
eg:
Class cc = Animal.class;
// Class cc = Class.forName("reflect.Animal");
try {
Object object = cc.newInstance();
// 反射操作方法,方法名、参数类型
Method hello = cc.getMethod("hello", String.class);
hello.invoke(object, "csk");
System.out.println("===============");
// 反射操作属性,属性名称
Field nameField = cc.getDeclaredField("name");
// 暴力反射,解除私有限定
nameField.setAccessible(true);
nameField.set(object, "csk");
System.out.println("name=" + nameField.get(object));
} catch (Exception e) {
e.printStackTrace();
}