前言
学习 Java 反射
内容!
一、反射
反射是与字节码相关的,字节码即编译生成的.class
文件。
利用反射技术操作字节码文件,也就是操作Class对象。
反射是一种技术,可以获取一个类的Class对象,通过Class对象自身的一些API执行一些对该对象的读写操作(获取对象该对象的一些属性和方法)。
二、Class对象
public class Person {
public int age;
public String name;
public void eat() {
}
}
Person p = new Person();
p.name = "张三";
p.age = 18;
p.eat();
Person p1 = new Person();
p.name = "李四";
p.age = 20;
p.eat();
System.out.println(p.getClass() == p1.getClass()); // 结果为true
而无论是p.getClass0还是p1.getClass0获取的都是这个对象所属的类的Class对象,都是Person这个类的Class对象。
Class对象是由一个具体的类产生的,一个类对应着一个Class对象。
二、获取Class对象的方法
// 1.Class.forName(“包名.类名”);
Class a = Class.forName("reflex.Person");
// 2. 实例对象.getClass();
Person p = new Person();
Class b = p.getClass();
// 3.Classc=任何类.class; 任何类都有class这个属性
Class c = Person.class;
三、获取Class对象的用处
通过Class对象创建对象
// 通过反射创建对象
// 1. 获取Class对象
// 2. 利用Class对象创建一个Person对象
Class c = Class.forName("reflex.Person");
Object o = c.newInstance(); // newInstance()为创建对象的方法,调用newInstance()需要保证对应的类中有一个无参构造方法(不能是有参构造函数会报错),创建对象时会自动调用类的无参构造方法
好处:灵活,可以通过读取配置文件的形式灵活创建对象
获取属性
Class c = Class.forName("reflex.Person");
Object o = c.newInstance();
Field[[] fields = c.getFields(); // 获取得到是public修饰的属性
for (Field ob : fields) {
System.out.println(ob.getName()); // 获取属性名
}
Field[[] declaredFields = c.getDeclareFields(); // 没有限制,获取所有的属性
给属性赋值
Field name = c.getField("name"); // 获取name属性
name.set(o, "张三");
name.get(o);
获取方法
Method[] methods = c.getDeclaredMethods(); // 通过Class对象,获取所有的方法
for (Method method : methods) {
System.out.println(method.getName()); // 得到方法名,不会打印出构造方法
}
c.getDeclaredMethod(); // 获取单独的方法
调用方法
// 1. 通过方法名和参数得到一个具体的方法
Method eat = c.getDeclaredMethod("eat", null); // null为参数
// 2. 得到方法之后开始调用
eat.invoke(o,null); // o为实例对象