Java中有个Object 类,是所有Java 类的继承根源,其内声明了数个应该在所有Java 类中被改写的方法:hashCode、equals、clone、toString、getClass等。其中getClass返回一个Class 对象。Class对象十分特殊。他是Java中所有类的实例,借助它可以实现对一个对象的操作。
实例
1. 准备工作
public class Person {
private String name;
private String age;
private void shot{
System.out.println("!!!");
}
protected void shot1 {
System.out.println("111");
}
public String getAge {
return age;
}
public String getName {
return name;
}
public void setAge(String age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
}
2. 创建Class对象
Person person = new Person;
Class<?> class2 = person.getClass;
Class<?> class1 = Class.forName("test0118.testR.Person");
Class<?> class3 = Person.class;
3. 对对象属性进行操作
获取类的属性
getFields只能访问类中声明为公有的字段,私有的字段它无法访问,能访问从其它类继承来的公有方法.
getDeclaredFields能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法
Field fields = class1.getDeclaredFields;
Field fields2 = class1.getFields;
for (Field field : fields) {
System.out.println(Modifier.toString(field.getModifiers) + field.getName);
}
for(Field field:fields2){
System.out.println(Modifier.toString(field.getModifiers)+field.getName);//由于Person类中并没有公有字段,所以该循环不输出任何值
}
/**
输出:
privatename
privateage
*/
获取类属性的修饰符
上述代码中有一个方法Modifier.toString(field.getModifiers)即是获取该属性的修饰符,field.getModifiers返回一个int值,将该值转化为对应的描述要用到Modifier.toString方法。
对类的属性进行操作
Field field = class1.getField("name");
Object object = class1.newInstance;
field.setAccessible(true);//打破了封装的特性,允许对私有属性直接进行操作
field.set(object, "123");
System.out.println(field.get(object));
获取类的方法
getMethods返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法。
getDeclaredMethods对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。当然也包括它所实现接口的方法。
Method methods = class1.getDeclaredMethods;
Method methods2 = class1.getMethods;
获取方法的参数和返回值的类型
method.getParameterTypes:获取方法参数类型,返回Class<?>数组
method.getReturnType:获取方法返回值类型,返回Class<?>对象
Class<?> ty = method.getParameterTypes;
Class<?> rty = method.getReturnType;
Object object = class1.newInstance;
Method method = class1.getMethod("setName", Class.forName("java.lang.String"));
method.invoke(object, "123123");
Method method2 = class1.getMethod("getName");
System.out.println((String) method2.invoke(object));
System.out.println(method.getReturnType);