Java - 反射

发布于:2022-12-13 ⋅ 阅读:(194) ⋅ 点赞:(0)

前言

          学习 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为实例对象


网站公告

今日签到

点亮在社区的每一天
去签到