反射
通过反射我们可以更好的理解java面向对象的特性
例如:
Method eat = clazz1.getMethod("eat");
此处eat对象就相当于下面的方法
public void eat() { System.out.println("I am eating..."); }
Dog类
package cf.duanzifan;
public class Dog implements Animal{
//字段
public String name; //公有的字段
private int age; //私有的字段
//方法
@Override
public void eat() {
System.out.println("I am eating...");
}
@Override
public void run() {
System.out.println("I am running...");
}
public void eat(String food){
System.out.println("I am eating" + food);
}
//构造方法
public Dog() {
}
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
//Getter、Setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
用反射得到Dog类对象,并用 类对象 的一些方法对Dag进行操作
- 获得类对象
package cf.duanzifan;
import java.lang.reflect.Field;
public class DogReflect {
public static void main(String[] args) {
Class clazz = Class.forName("cf.duanzifan.Dog"); //通过全类名来获取类对象
Class clazz = dog.getClass(); //通过对象来获取类对象
Class clazz = Dog.class; //通过类来获取类对象
System.out.println(clazz); //class cf.duanzifan.Dog
}
- 通过类对象创建一个对象
Object dog = clazz1.newInstance();
字段操作
- 通过类对象对字段的一些操作
//getField
Field name = clazz.getField("name"); //getField()方法只能获取 公有的字段
System.out.println(name); //public java.lang.String cf.duanzifan.Dog.name
//getDeclaredField
Field age = clazz.getDeclaredField("age"); //getDeclaredField()方法可以获取 私有和公有的字段
System.out.println(age); //private int cf.duanzifan.Dog.age
//getFields
Field[] fields = clazz1.getFields(); //getFields()方法,可以获得所有public的字段
for(Field field : fields){
System.out.println(field);
}
//getDeclaredFields
Field[] declaredFields = clazz1.getDeclaredFields(); //getDeclaredFields可以获得所有的字段
for(Field field : declaredFields){
System.out.println(field);
}
- Field 字段的一些方法
Field name = clazz.getField("name");
//public 字段的设值与取值
name.set(dog,"xiaohei");
Object name1 = name.get(dog);
System.out.println(name1); //xiaohei
//获得字段的类型
System.out.println(name.getType()); //class java.lang.String
//private 字段的设值与取值
//暴力注入
age.setAccessible(true); //授权
age.set(dog,3);
Object age1 = age.get(dog);
System.out.println(age1); //3
//获得字段的类型
System.out.println(age.getType()); //int
方法操作
- 通过类对象对方法的一些操作
Method eat = clazz1.getMethod("eat"); //只传入方法名,默认是获得无参数的方法
Method eat1 = clazz1.getMethod("eat", String.class); //传入方法名和参数的类对象
- Method的一些方法
Method eat = clazz1.getMethod("eat");
//invoke是执行方法
eat.invoke(dog); //I am eating...
eat1.invoke(dog,"meat"); //I am eating meat
//getParameterTypes是获得方法参数类型
Class<?>[] parameterTypes = eat1.getParameterTypes();
for(Object type : parameterTypes){
System.out.println(type); //class java.lang.String
}