反射相关的主要类
- java.lang.Class:代表一个类,Class对象表示某个类加载后在堆中的对象
- java.lang.reflect.Method:代表类的方法,Method对象表示某个类的方法
- java.lang.reflect.Field:代表类的成员变量,Field对象表示某个类的成员变量
- java.lang.reflect.Constructor:代表类的构造方法, Constructor对象表示构造器
Class类基本介绍
- Class也是类,,因此也继承Object类
- Class类对象不是new出来的,而是系统创建的
- 对于某个类的Class类对象,在内存中只有一份,因为类只加载一
- 每个类的实例都会记得自己是由哪个Class 实例所生成
- 通过Class可以完整地得到一个类的完整结构,通过一系列API
- Class对象是存放在堆的
- 类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据 (包括方法代码,变量名,方法名,访问权限等等)https://www.zhihu.com/question/38496907
Class常用方法
常用方法演示-应用实例
/**
* 演示 Class类常用方法
*/
public class Class01 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException {
String classAllPath = "com.kuang.reflection.Car";
//1、获取Car类对应的Class对象,<?>表示不确定的Java类型
Class<?> aClass = Class.forName(classAllPath);
//2、输出 aClass
System.out.println(aClass);//显示aClass对象 是哪个类的Class对象 这里是com.kuang.reflection.Car
System.out.println(aClass.getClass());//输出aClass运行类型 java.lang.Class
//3、得到包名
System.out.println(aClass.getPackage().getName());//包名 com.kuang.reflection
//4、得到全类名
System.out.println(aClass.getName()); //com.kuang.reflection.Car
//5、通过 aClass 创建对象实例
Object o = aClass.newInstance();
System.out.println(o);
//6、通过反射得到属性
Field brand = aClass.getField("brand");
System.out.println(brand.get(o));//得到品牌:梅德塞斯-奔驰
//7、通过反射给属性赋值
brand.set(o,"宝马");
System.out.println(brand.get(o));
//8、得到所有字段属性
Field[] fields = aClass.getFields();
for (Field f :fields) {
System.out.println(f.getName()); //s属性名称
}
}
}
class Car {
public String brand = "梅德塞斯-奔驰";
public int price = 500000;
public String color = "耀夜黑";
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", price=" + price +
", color='" + color + '\'' +
'}';
}
}
反射优点和缺点
- 优点:可以动态的创建和使用对象(也是框架底意亥心),使用灵活,没有反射机制,框架技术就失去底层支撑。
- 缺点:使用反射基本是解释执行,对执行速度有影响。